summaryrefslogtreecommitdiff
path: root/scripts/run_web_tests.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/run_web_tests.py')
-rwxr-xr-xscripts/run_web_tests.py143
1 files changed, 143 insertions, 0 deletions
diff --git a/scripts/run_web_tests.py b/scripts/run_web_tests.py
new file mode 100755
index 0000000..779abdc
--- /dev/null
+++ b/scripts/run_web_tests.py
@@ -0,0 +1,143 @@
+#!/usr/bin/python
+"""Test assumptions that Android relies on."""
+
+import glob
+import unittest
+
+from fontTools import ttLib
+from nototools import coverage
+from nototools import font_data
+
+
+def load_fonts():
+ """Load all web fonts."""
+ all_font_files = glob.glob('out/web/*.ttf')
+ all_fonts = [ttLib.TTFont(font) for font in all_font_files]
+ assert len(all_font_files) == 12
+ return all_font_files, all_fonts
+
+
+class TestVerticalMetrics(unittest.TestCase):
+ """Test the vertical metrics of fonts."""
+
+ def setUp(self):
+ _, self.fonts = load_fonts()
+
+ def test_ymin_ymax(self):
+ """Tests yMin and yMax to be equal to the old values."""
+ for font in self.fonts:
+ head_table = font['head']
+ self.assertEqual(head_table.yMin, -555)
+ self.assertEqual(head_table.yMax, 2163)
+
+ def test_other_metrics(self):
+ """Tests other vertical metrics to be equal to the old values."""
+ for font in self.fonts:
+ hhea_table = font['hhea']
+ self.assertEqual(hhea_table.descent, -500)
+ self.assertEqual(hhea_table.ascent, 1900)
+
+ os2_table = font['OS/2']
+ self.assertEqual(os2_table.sTypoDescender, -512)
+ self.assertEqual(os2_table.sTypoAscender, 1536)
+ self.assertEqual(os2_table.sTypoLineGap, 102)
+ self.assertEqual(os2_table.usWinDescent, 512)
+ self.assertEqual(os2_table.usWinAscent, 1946)
+
+
+class TestCharacterCoverage(unittest.TestCase):
+ """Tests character coverage."""
+
+ def setUp(self):
+ _, self.fonts = load_fonts()
+ self.LEGACY_PUA = frozenset({0xEE01, 0xEE02, 0xF6C3})
+
+ def test_inclusion_of_legacy_pua(self):
+ """Tests that legacy PUA characters remain in the fonts."""
+ for font in self.fonts:
+ charset = coverage.character_set(font)
+ for char in self.LEGACY_PUA:
+ self.assertIn(char, charset)
+
+ def test_non_inclusion_of_other_pua(self):
+ """Tests that there are not other PUA characters except legacy ones."""
+ for font in self.fonts:
+ charset = coverage.character_set(font)
+ pua_chars = {
+ char for char in charset
+ if 0xE000 <= char <= 0xF8FF or 0xF0000 <= char <= 0x10FFFF}
+ self.assertTrue(pua_chars <= self.LEGACY_PUA)
+
+ def test_lack_of_unassigned_chars(self):
+ """Tests that unassigned characters are not in the fonts."""
+ for font in self.fonts:
+ charset = coverage.character_set(font)
+ self.assertNotIn(0x2072, charset)
+ self.assertNotIn(0x2073, charset)
+ self.assertNotIn(0x208F, charset)
+
+
+class TestItalicAngle(unittest.TestCase):
+ """Test the italic angle of fonts."""
+
+ def setUp(self):
+ _, self.fonts = load_fonts()
+
+ def test_italic_angle(self):
+ """Tests the italic angle of fonts to be correct."""
+ for font in self.fonts:
+ post_table = font['post']
+ if 'Italic' in font_data.font_name(font):
+ expected_angle = -12.0
+ else:
+ expected_angle = 0.0
+ self.assertEqual(post_table.italicAngle, expected_angle)
+
+
+class TestDigitWidths(unittest.TestCase):
+ """Tests the width of digits."""
+
+ def setUp(self):
+ _, self.fonts = load_fonts()
+ self.digits = [
+ 'zero', 'one', 'two', 'three', 'four',
+ 'five', 'six', 'seven', 'eight', 'nine']
+
+ def test_digit_widths(self):
+ """Tests all decimal digits to make sure they have the same width."""
+ for font in self.fonts:
+ hmtx_table = font['hmtx']
+ widths = [hmtx_table[digit][0] for digit in self.digits]
+ self.assertEqual(len(set(widths)), 1)
+
+
+class TestHints(unittest.TestCase):
+ """Tests hints."""
+
+ def setUp(self):
+ _, self.fonts = load_fonts()
+
+ # FIXME: remove as soon as issue 100 is fixed
+ bad_glyphs = ['uniFB01', 'uniFB02', 'uniFB03',
+ 'uniFB04', 'uniFFFC', 'uni048C']
+ self.known_missing_hints = [
+ (g, 'Roboto Light Italic') for g in bad_glyphs]
+
+ def test_digit_widths(self):
+ """Tests all glyphs and makes sure non-composite ones have hints."""
+ missing_hints = []
+ for font in self.fonts:
+ glyf_table = font['glyf']
+ for glyph_name in font.getGlyphOrder():
+ glyph = glyf_table[glyph_name]
+ if glyph.numberOfContours <= 0: # composite or empty glyph
+ continue
+ if len(glyph.program.bytecode) <= 0:
+ missing_hints.append(
+ (glyph_name, font_data.font_name(font)))
+
+ self.assertTrue(missing_hints <= self.known_missing_hints)
+
+
+if __name__ == '__main__':
+ unittest.main()