Fantom

 

//
// Copyright (c) 2008, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
//   16 Jun 2008  Brian Frank  Creation
//   12 May 2016  Brian Frank  SVG/CSS changes
//

**
** FontTest
**
@Js
class FontTest : Test
{

  Void testWeight()
  {
    verifyEq(FontWeight.fromNum(400), FontWeight.normal)
    verifyEq(FontWeight.fromNum(700), FontWeight.bold)
    verifyEq(FontWeight.fromNum(99, false), null)
    verifyErr(ArgErr#) { FontWeight.fromNum(-1) }
    verifyErr(ArgErr#) { FontWeight.fromNum(0, true) }

    verifyEq(FontWeight.decode("300"), FontWeight.light)
    verifyEq(FontWeight.decode("400"), FontWeight.normal)
    verifyEq(FontWeight.decode("normal"), FontWeight.normal)
    verifyEq(FontWeight.decode("bold"), FontWeight.bold)
    verifyEq(FontWeight.decode("900"), FontWeight.black)
    verifyEq(FontWeight.decode("foo", false), null)
    verifyEq(FontWeight.decode("555", false), null)
    verifyErr(ArgErr#) { FontWeight.decode("badone") }
    verifyErr(ArgErr#) { FontWeight.decode("123", true) }
  }

  Void testMake()
  {
    verifyFont(Font { names = ["Arial"]; size = 10f },
      ["Arial"], 10f, FontWeight.normal, FontStyle.normal, "10pt Arial")

    verifyFont(Font { names = ["Arial", "sans-serif"]; size = 11f; weight= FontWeight.bold },
      ["Arial", "sans-serif"], 11f, FontWeight.bold, FontStyle.normal, "700 11pt Arial,sans-serif")

    verifyFont(Font { names = ["Courier", "monospace"]; size = 12f; style= FontStyle.italic },
      ["Courier", "monospace"], 12f, FontWeight.normal, FontStyle.italic, "italic 12pt Courier,monospace")

    verifyFont(Font { names = ["Courier", "monospace"]; size = 12f; weight= FontWeight.light; style= FontStyle.italic },
      ["Courier", "monospace"], 12f, FontWeight.light, FontStyle.italic, "italic 300 12pt Courier,monospace")

    verifyFont(Font.fromStr("12pt Courier, monospace"),
      ["Courier", "monospace"], 12f, FontWeight.normal, FontStyle.normal, "12pt Courier,monospace")

    verifyFont(Font.fromStr("normal 12pt Courier, monospace"),
      ["Courier", "monospace"], 12f, FontWeight.normal, FontStyle.normal, "12pt Courier,monospace")

    verifyFont(Font.fromStr("normal bold 12pt Courier, monospace"),
      ["Courier", "monospace"], 12f, FontWeight.bold, FontStyle.normal, "700 12pt Courier,monospace")

    verifyFont(Font.fromStr("bold 12pt Consolas, Courier, monospace"),
      ["Consolas", "Courier", "monospace"], 12f, FontWeight.bold, FontStyle.normal, "700 12pt Consolas,Courier,monospace")

    verifyErr(ParseErr#) { x := Font.fromStr("10 Arial") }
    verifyErr(ParseErr#) { x := Font.fromStr("", true) }
  }

  Void verifyFont(Font f, Str[] names, Float size, FontWeight weight, FontStyle style, Str str)
  {
    //echo("=== $f")
    //echo("    " + Font.fromStr(f.toStr))

    verifyEq(f.names, names)
    verifyEq(f.size, size)
    verifyEq(f.weight, weight)
    verifyEq(f.style, style)
    verifyEq(f.toStr, str)

    verifyEq(f, Font { it.names = names; it.size = size; it.weight = weight; it.style = style })
    verifyNotEq(f, Font { it.names = names.dup.add("x"); it.size = size; it.weight = weight; it.style = style })
    verifyNotEq(f, Font { it.names = names; it.size = size+1; it.weight = weight; it.style = style })
    verifyNotEq(f, Font { it.names = names; it.size = size; it.weight = FontWeight.fromNum(weight.num+100); it.style = style })
    verifyNotEq(f, Font { it.names = names; it.size = size; it.weight = weight; it.style = FontStyle.vals[style.ordinal+1] })

    verifyEq(f, Font.fromStr(f.toStr))
    verifyEq(f, Buf().writeObj(f).flip.readObj)
  }

  Void testNormalize()
  {
    ["Helvetica", "Something,Helvetica"].each |x|
    {
      verifyNormalize("12pt $x", "12pt Helvetica")
      verifyNormalize("14pt $x", "14pt Helvetica")
      verifyNormalize("oblique 14pt $x", "italic 14pt Helvetica")
      verifyNormalize("italic 14pt $x", "italic 14pt Helvetica")
      verifyNormalize("bold 11pt $x", "700 11pt Helvetica")
      verifyNormalize("300 8pt $x", "8pt Helvetica")
      verifyNormalize("500 8pt $x", "700 8pt Helvetica")
      verifyNormalize("600 8pt $x", "700 8pt Helvetica")
      verifyNormalize("900 8pt $x", "700 8pt Helvetica")
      verifyNormalize("italic 600 8pt $x", "italic 700 8pt Helvetica")
      verifyNormalize("italic 300 8pt $x", "italic 8pt Helvetica")
    }

    verifyNormalize("12pt Roboto Mono", "12pt Roboto Mono")
    verifyNormalize("bold 12pt Roboto Mono", "12pt Roboto Mono")
  }

  Void verifyNormalize(Str s, Str expected)
  {
    f := Font(s)
    actual := f.normalize
    //echo("-- $f")
    //echo("   $actual")
    verifyEq(actual.toStr, expected)
  }

  Void testProps()
  {
    verifyProps("12pt Helvetica", ["font-family":"Helvetica", "font-size":"12pt"])
    verifyProps("bold 12pt Helvetica", ["font-family":"Helvetica", "font-size":"12pt", "font-weight":"700"])
    verifyProps("300 12pt Helvetica", ["font-family":"Helvetica", "font-size":"12pt", "font-weight":"300"])
    verifyProps("italic 12pt Helvetica", ["font-family":"Helvetica", "font-size":"12pt", "font-style":"italic"])
    verifyProps("italic bold 11pt Helvetica", ["font-family":"Helvetica", "font-size":"11pt", "font-weight":"700", "font-style":"italic"])
    verifyProps("italic 800 8pt Helvetica", ["font-family":"Helvetica", "font-size":"8pt", "font-weight":"800", "font-style":"italic"])
  }

  Void verifyProps(Str str, Str:Str props)
  {
    f := Font(str)
    verifyEq(f.toProps, props)
    verifyEq(Font.fromProps(props), f)
  }
}