aboutsummaryrefslogtreecommitdiffstats
path: root/tests/defconQt/fontInfo_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/defconQt/fontInfo_test.py')
-rw-r--r--tests/defconQt/fontInfo_test.py597
1 files changed, 597 insertions, 0 deletions
diff --git a/tests/defconQt/fontInfo_test.py b/tests/defconQt/fontInfo_test.py
new file mode 100644
index 0000000..5260689
--- /dev/null
+++ b/tests/defconQt/fontInfo_test.py
@@ -0,0 +1,597 @@
+import unittest
+import sys
+from PyQt5.QtCore import Qt
+from PyQt5.QtGui import QDoubleValidator, QIntValidator
+from PyQt5.QtWidgets import QWidget
+from defconQt.fontView import Application, MainWindow
+from defconQt.fontInfo import InfoTabWidget
+
+
+class InfoTabWidgetTest(unittest.TestCase):
+
+ app = Application(sys.argv)
+
+ def __init__(self, methodName):
+ unittest.TestCase.__init__(self, methodName)
+
+ def setUp(self):
+ self.infoTab = InfoTabWidget(None)
+
+ def test_addNamedTab(self):
+ tab1 = QWidget(None)
+ tab1.name = "Test1"
+ self.infoTab.addNamedTab(tab1)
+ tab2 = self.infoTab.widget(0)
+ self.assertEqual(tab1, tab2)
+ self.assertEqual(tab1.name, tab2.name)
+
+ tab2 = QWidget(None)
+ tab2.name = "Test2"
+ self.infoTab.addNamedTab(tab2)
+ tab2 = self.infoTab.widget(0)
+ self.assertEqual(tab1, tab2)
+ self.assertEqual(tab1.name, tab2.name)
+
+
+# TODO TabDialogTest
+
+# TODO TabWidget
+
+class TabTestCase(unittest.TestCase):
+
+ app = Application(sys.argv)
+
+ def __init__(self, methodName):
+ unittest.TestCase.__init__(self, methodName)
+
+ def setUp(self):
+ self.mainWindow = MainWindow(None)
+ self.mainWindow.fontInfo()
+ self.font = self.mainWindow.font
+ self.fontInfo = self.mainWindow.fontInfoWindow
+ self.generalTab = self.fontInfo.tabWidget.widget(0)
+ self.metricsTab = self.fontInfo.tabWidget.widget(1)
+ self.openTypeTab = self.fontInfo.tabWidget.widget(2)
+ self.OS2Tab = self.fontInfo.tabWidget.widget(3)
+ self.postScriptTab = self.fontInfo.tabWidget.widget(4)
+ self.fontInfo.show()
+
+ def tearDown(self):
+ self.fontInfo.close()
+
+ def checkString(self, attr, attrName):
+ attrEdit = getattr(self.tab, attr + "Edit")
+ self.assertIsNone(getattr(self.font.info, attrName))
+ self.assertEqual(attrEdit.text(), "")
+
+ attrEdit.setText("Typeface " + attr)
+ self.fontInfo.accept()
+ self.assertEqual(getattr(self.font.info, attrName), "Typeface " + attr)
+
+ attrEdit.setText("")
+ self.fontInfo.accept()
+ self.assertIsNone(getattr(self.font.info, attrName))
+
+ def checkInteger(self, attr, attrName, value=0):
+ attrEdit = getattr(self.tab, attr + "Edit")
+ if value == 0:
+ self.assertIsNone(getattr(self.font.info, attrName))
+ self.assertEqual(attrEdit.text(), "")
+ else:
+ self.assertIsNotNone(getattr(self.font.info, attrName))
+ self.assertEqual(attrEdit.text(), str(value))
+
+ attrEdit.setText("123")
+ self.fontInfo.accept()
+ self.assertEqual(getattr(self.font.info, attrName), 123)
+
+ attrEdit.setText("0")
+ self.fontInfo.accept()
+ self.assertEqual(getattr(self.font.info, attrName), 0)
+
+ attrEdit.setText("-123")
+ self.fontInfo.accept()
+ self.assertEqual(getattr(self.font.info, attrName), -123)
+
+ attrEdit.setText("")
+ self.fontInfo.accept()
+ self.assertIsNone(getattr(self.font.info, attrName))
+
+ validator = attrEdit.validator()
+ self.assertIsInstance(validator, QIntValidator)
+ self.assertEqual(validator.bottom(), QIntValidator().bottom())
+ self.assertEqual(validator.top(), QIntValidator().top())
+
+ def checkPositiveInteger(self, attr, attrName, value=0):
+ attrEdit = getattr(self.tab, attr + "Edit")
+ if value == 0:
+ self.assertIsNone(getattr(self.font.info, attrName))
+ self.assertEqual(attrEdit.text(), "")
+ else:
+ self.assertIsNotNone(getattr(self.font.info, attrName))
+ self.assertEqual(attrEdit.text(), str(value))
+
+ attrEdit.setText("123")
+ self.fontInfo.accept()
+ self.assertEqual(getattr(self.font.info, attrName), 123)
+
+ attrEdit.setText("0")
+ self.fontInfo.accept()
+ self.assertEqual(getattr(self.font.info, attrName), 0)
+
+ attrEdit.setText("")
+ self.fontInfo.accept()
+ self.assertIsNone(getattr(self.font.info, attrName))
+
+ validator = attrEdit.validator()
+ self.assertIsInstance(validator, QIntValidator)
+ self.assertEqual(validator.bottom(), 0)
+ self.assertEqual(validator.top(), QIntValidator().top())
+
+ def checkNegativeInteger(self, attr, attrName, value=0):
+ attrEdit = getattr(self.tab, attr + "Edit")
+ if value == 0:
+ self.assertIsNone(getattr(self.font.info, attrName))
+ self.assertEqual(attrEdit.text(), "")
+ else:
+ self.assertIsNotNone(getattr(self.font.info, attrName))
+ self.assertEqual(attrEdit.text(), str(value))
+
+ attrEdit.setText("-123")
+ self.fontInfo.accept()
+ self.assertEqual(getattr(self.font.info, attrName), -123)
+
+ attrEdit.setText("0")
+ self.fontInfo.accept()
+ self.assertEqual(getattr(self.font.info, attrName), 0)
+
+ attrEdit.setText("")
+ self.fontInfo.accept()
+ self.assertIsNone(getattr(self.font.info, attrName))
+
+ validator = attrEdit.validator()
+ self.assertIsInstance(validator, QIntValidator)
+ self.assertEqual(validator.top(), 0)
+ self.assertEqual(validator.bottom(), QIntValidator().bottom())
+
+ def checkIntegerFloat(self, attr, attrName, value=0):
+ attrEdit = getattr(self.tab, attr + "Edit")
+ if value == 0:
+ self.assertIsNone(getattr(self.font.info, attrName))
+ self.assertEqual(attrEdit.text(), "")
+ else:
+ self.assertIsNotNone(getattr(self.font.info, attrName))
+ self.assertEqual(attrEdit.text(), str(value))
+
+ attrEdit.setText("123")
+ self.fontInfo.accept()
+ self.assertEqual(getattr(self.font.info, attrName), 123)
+
+ attrEdit.setText("123.456")
+ self.fontInfo.accept()
+ self.assertEqual(getattr(self.font.info, attrName), 123.456)
+
+ attrEdit.setText("0")
+ self.fontInfo.accept()
+ self.assertEqual(getattr(self.font.info, attrName), 0)
+
+ attrEdit.setText("0.0")
+ self.fontInfo.accept()
+ self.assertEqual(getattr(self.font.info, attrName), 0.0)
+
+ attrEdit.setText("-123")
+ self.fontInfo.accept()
+ self.assertEqual(getattr(self.font.info, attrName), -123)
+
+ attrEdit.setText("-123.456")
+ self.fontInfo.accept()
+ self.assertEqual(getattr(self.font.info, attrName), -123.456)
+
+ attrEdit.setText("")
+ self.fontInfo.accept()
+ self.assertIsNone(getattr(self.font.info, attrName))
+
+ validator = attrEdit.validator()
+ self.assertIsInstance(validator, QDoubleValidator)
+ self.assertEqual(validator.bottom(), QDoubleValidator().bottom())
+ self.assertEqual(validator.top(), QDoubleValidator().top())
+
+ def checkPositiveIntegerFloat(self, attr, attrName, value=0):
+ attrEdit = getattr(self.tab, attr + "Edit")
+ if value == 0:
+ self.assertIsNone(getattr(self.font.info, attrName))
+ self.assertEqual(attrEdit.text(), "")
+ else:
+ self.assertIsNotNone(getattr(self.font.info, attrName))
+ self.assertEqual(attrEdit.text(), str(value))
+
+ attrEdit.setText("123")
+ self.fontInfo.accept()
+ self.assertEqual(getattr(self.font.info, attrName), 123)
+
+ attrEdit.setText("123.456")
+ self.fontInfo.accept()
+ self.assertEqual(getattr(self.font.info, attrName), 123.456)
+
+ attrEdit.setText("0")
+ self.fontInfo.accept()
+ self.assertEqual(getattr(self.font.info, attrName), 0)
+
+ attrEdit.setText("0.0")
+ self.fontInfo.accept()
+ self.assertEqual(getattr(self.font.info, attrName), 0.0)
+
+ attrEdit.setText("")
+ self.fontInfo.accept()
+ self.assertIsNone(getattr(self.font.info, attrName))
+
+ validator = attrEdit.validator()
+ self.assertIsInstance(validator, QDoubleValidator)
+ self.assertEqual(validator.bottom(), 0)
+ self.assertEqual(validator.top(), QDoubleValidator().top())
+
+ def checkIntegerFloatList(self, attr, attrName, maxLen=None, evenLen=None):
+ attrEdit = getattr(self.tab, attr + "Edit")
+ values = attrEdit.text()
+ if values is "":
+ self.assertEqual(getattr(self.font.info, attrName), [])
+ else:
+ attrEdit.setText("123 456 789 0")
+ self.fontInfo.accept()
+ self.assertIsNotNone(getattr(self.font.info, attrName))
+
+ values = attrEdit.text().split(" ")
+ for i, val in enumerate(values):
+ if val != "":
+ self.assertEqual(
+ int(val), getattr(self.font.info, attrName)[i])
+
+ attrEdit.setText("123 456 789 0")
+ self.fontInfo.accept()
+ self.assertIsNotNone(getattr(self.font.info, attrName))
+
+ # TODO: test validation
+
+ def checkBoolean(self, attr, attrName):
+ attrBox = getattr(self.tab, attr + "Box")
+ self.assertTrue(attrBox.isTristate())
+
+ value = attrBox.checkState()
+ self.assertEqual(value, Qt.PartiallyChecked)
+ self.assertEqual(getattr(self.font.info, attrName), None)
+
+ attrBox.setCheckState(Qt.Checked)
+ self.fontInfo.accept()
+ value = attrBox.checkState()
+ self.assertEqual(value, Qt.Checked)
+ self.assertEqual(getattr(self.font.info, attrName), True)
+
+ attrBox.setCheckState(Qt.Unchecked)
+ self.fontInfo.accept()
+ value = attrBox.checkState()
+ self.assertEqual(value, Qt.Unchecked)
+ self.assertEqual(getattr(self.font.info, attrName), False)
+
+
+class GeneralTabTest(TabTestCase):
+
+ def __init__(self, methodName):
+ super(GeneralTabTest, self).__init__(methodName)
+
+ def setUp(self):
+ super(GeneralTabTest, self).setUp()
+ self.tab = self.generalTab
+
+ def test_GeneralTab_name(self):
+ self.assertEqual(self.tab.name, "General")
+
+ def test_familyName(self):
+ self.checkString("familyName", "familyName")
+
+ def test_styleName(self):
+ self.checkString("styleName", "styleName")
+
+ def test_copyright(self):
+ self.checkString("copyright", "copyright")
+
+ def test_trademark(self):
+ self.checkString("trademark", "trademark")
+
+ def test_designer(self):
+ self.checkString("designer", "openTypeNameDesigner")
+
+ def test_designerURL(self):
+ self.checkString("designerURL", "openTypeNameDesignerURL")
+
+ def test_manufacturer(self):
+ self.checkString("manufacturer", "openTypeNameManufacturer")
+
+ def test_manufacturerURL(self):
+ self.checkString("manufacturerURL", "openTypeNameManufacturerURL")
+
+ def test_license(self):
+ self.checkString("license", "openTypeNameLicense")
+
+ def test_licenseURL(self):
+ self.checkString("licenseURL", "openTypeNameLicenseURL")
+
+ def test_versionMajor(self):
+ self.checkInteger("versionMajor", "versionMajor")
+
+ def test_versionMinor(self):
+ self.checkPositiveInteger("versionMinor", "versionMinor")
+
+
+class MetricsTabTest(TabTestCase):
+
+ def __init__(self, methodName):
+ super(MetricsTabTest, self).__init__(methodName)
+
+ def setUp(self):
+ super(MetricsTabTest, self).setUp()
+ self.tab = self.metricsTab
+
+ def test_MetricsTab_name(self):
+ self.assertEqual(self.tab.name, "Metrics")
+
+ # TODO styleMapFamilyName
+
+ def test_unitsPerEm(self):
+ self.checkPositiveIntegerFloat(
+ "unitsPerEm", "unitsPerEm", value="1000")
+
+ def test_italicAngle(self):
+ self.checkIntegerFloat("italicAngle", "italicAngle")
+
+ def test_ascender(self):
+ self.checkIntegerFloat("ascender", "ascender", 750)
+
+ def test_descender(self):
+ self.checkIntegerFloat("descender", "descender", -250)
+
+ def test_capHeight(self):
+ self.checkIntegerFloat("capHeight", "capHeight", 750)
+
+ def test_xHeight(self):
+ self.checkIntegerFloat("xHeight", "xHeight", 500)
+
+ # TODO test_noteEdit
+
+
+class OpenTypeTabTest(TabTestCase):
+
+ def __init__(self, methodName):
+ super(OpenTypeTabTest, self).__init__(methodName)
+
+ def setUp(self):
+ super(OpenTypeTabTest, self).setUp()
+ self.tab = self.openTypeTab
+
+ def test_OpenTypeTab_name(self):
+ self.assertEqual(self.tab.name, "OpenType")
+
+ def test_preferredFamilyName(self):
+ self.checkString(
+ "preferredFamilyName", "openTypeNamePreferredFamilyName")
+
+ def test_preferredSubfamilyName(self):
+ self.checkString(
+ "preferredSubfamilyName", "openTypeNamePreferredSubfamilyName")
+
+ def test_compatibleFullName(self):
+ self.checkString(
+ "compatibleFullName", "openTypeNameCompatibleFullName")
+
+ def test_WWSFamilyName(self):
+ self.checkString("WWSFamilyName", "openTypeNameWWSFamilyName")
+
+ def test_WWSSubfamilyName(self):
+ self.checkString("WWSSubfamilyName", "openTypeNameWWSSubfamilyName")
+
+ def test_version(self):
+ self.checkString("version", "openTypeNameVersion")
+
+ def test_uniqueID(self):
+ self.checkString("uniqueID", "openTypeNameUniqueID")
+
+ def test_description(self):
+ self.checkString("description", "openTypeNameDescription")
+
+ def test_sampleText(self):
+ self.checkString("sampleText", "openTypeNameSampleText")
+
+ def test_ascender(self):
+ self.checkInteger("ascender", "openTypeHheaAscender")
+
+ def test_descender(self):
+ self.checkInteger("descender", "openTypeHheaDescender")
+
+ def test_lineGap(self):
+ self.checkInteger("lineGap", "openTypeHheaLineGap")
+
+ def test_caretSlopeRise(self):
+ self.checkInteger("caretSlopeRise", "openTypeHheaCaretSlopeRise")
+
+ def test_caretSlopeRun(self):
+ self.checkInteger("caretSlopeRun", "openTypeHheaCaretSlopeRun")
+
+ def test_caretOffset(self):
+ self.checkInteger("caretOffset", "openTypeHheaCaretOffset")
+
+ def test_vertTypoAscender(self):
+ self.checkInteger("vertTypoAscender", "openTypeVheaVertTypoAscender")
+
+ def test_vertTypoDescender(self):
+ self.checkInteger("vertTypoDescender", "openTypeVheaVertTypoDescender")
+
+ def test_vertTypoLineGap(self):
+ self.checkInteger("vertTypoLineGap", "openTypeVheaVertTypoLineGap")
+
+ def test_vheaCaretSlopeRise(self):
+ self.checkInteger("vheaCaretSlopeRise", "openTypeVheaCaretSlopeRise")
+
+ def test_vheaCaretSlopeRun(self):
+ self.checkInteger("vheaCaretSlopeRun", "openTypeVheaCaretSlopeRun")
+
+ def test_vheaCaretOffset(self):
+ self.checkInteger("vheaCaretOffset", "openTypeVheaCaretOffset")
+
+
+class OS2TabTest(TabTestCase):
+
+ def __init__(self, methodName):
+ super(OS2TabTest, self).__init__(methodName)
+
+ def setUp(self):
+ super(OS2TabTest, self).setUp()
+ self.tab = self.OS2Tab
+
+ def test_OS2Tab_name(self):
+ self.assertEqual(self.tab.name, "OS/2")
+
+ # TODO: test_usWidthClassLabel()
+
+ # TODO: test_fsSelection()
+
+ # TODO: test_achVendorID()
+
+ # TODO: fsType
+
+ # XXX: ulUnicodeRange, ulCodePageRange are not implemented yet
+
+ def test_usWeightClass(self):
+ self.checkPositiveInteger("usWeightClass", "openTypeOS2WeightClass")
+
+ def test_sTypoAscender(self):
+ self.checkInteger("sTypoAscender", "openTypeOS2TypoAscender")
+
+ def test_sTypoDescender(self):
+ self.checkInteger("sTypoDescender", "openTypeOS2TypoDescender")
+
+ def test_sTypoLineGap(self):
+ self.checkInteger("sTypoLineGap", "openTypeOS2TypoLineGap")
+
+ def test_usWinAscent(self):
+ self.checkPositiveInteger("usWinAscent", "openTypeOS2WinAscent")
+
+ def test_usWinDescent(self):
+ self.checkPositiveInteger("usWinDescent", "openTypeOS2WinDescent")
+
+ def test_ySubscriptXSize(self):
+ self.checkInteger("ySubscriptXSize", "openTypeOS2SubscriptXSize")
+
+ def test_ySubscriptYSize(self):
+ self.checkInteger("ySubscriptYSize", "openTypeOS2SubscriptYSize")
+
+ def test_ySubscriptXOffset(self):
+ self.checkInteger("ySubscriptXOffset", "openTypeOS2SubscriptXOffset")
+
+ def test_ySubscriptYOffset(self):
+ self.checkInteger("ySubscriptYOffset", "openTypeOS2SubscriptYOffset")
+
+ def test_ySuperscriptXSize(self):
+ self.checkInteger("ySuperscriptXSize", "openTypeOS2SuperscriptXSize")
+
+ def test_ySuperscriptYSize(self):
+ self.checkInteger("ySuperscriptYSize", "openTypeOS2SuperscriptYSize")
+
+ def test_ySuperscriptXOffset(self):
+ self.checkInteger(
+ "ySuperscriptXOffset", "openTypeOS2SuperscriptXOffset")
+
+ def test_ySuperscriptYOffset(self):
+ self.checkInteger(
+ "ySuperscriptYOffset", "openTypeOS2SuperscriptYOffset")
+
+ def test_yStrikeoutSize(self):
+ self.checkInteger("yStrikeoutSize", "openTypeOS2StrikeoutSize")
+
+ def test_yStrikeoutPosition(self):
+ self.checkInteger("yStrikeoutPosition", "openTypeOS2StrikeoutPosition")
+
+ # XXX: Panose is not implemented yet
+
+
+class PostScriptTabTest(TabTestCase):
+
+ def __init__(self, methodName):
+ super(PostScriptTabTest, self).__init__(methodName)
+
+ def setUp(self):
+ super(PostScriptTabTest, self).setUp()
+ self.tab = self.postScriptTab
+
+ def test_PostScriptTab_name(self):
+ self.assertEqual(self.tab.name, "PostScript")
+
+ def test_fontName(self):
+ self.checkString("fontName", "postscriptFontName")
+
+ def test_fullName(self):
+ self.checkString("fullName", "postscriptFullName")
+
+ def test_weightName(self):
+ self.checkString("weightName", "postscriptWeightName")
+
+ def test_uniqueID(self):
+ self.checkInteger("uniqueID", "postscriptUniqueID")
+
+ def test_blueValues(self):
+ self.checkIntegerFloatList("blueValues", "postscriptBlueValues")
+
+ def test_otherBlues(self):
+ self.checkIntegerFloatList("otherBlues", "postscriptOtherBlues")
+
+ def test_familyBlues(self):
+ self.checkIntegerFloatList("familyBlues", "postscriptFamilyBlues")
+
+ def test_familyOtherBlues(self):
+ self.checkIntegerFloatList(
+ "familyOtherBlues", "postscriptFamilyOtherBlues")
+
+ def test_stemSnapH(self):
+ self.checkIntegerFloatList("stemSnapH", "postscriptStemSnapH")
+
+ def test_stemSnapV(self):
+ self.checkIntegerFloatList("stemSnapV", "postscriptStemSnapV")
+
+ def test_blueFuzz(self):
+ self.checkIntegerFloat("blueFuzz", "postscriptBlueFuzz")
+
+ def test_blueScale(self):
+ self.checkIntegerFloat("blueScale", "postscriptBlueScale")
+
+ def test_forceBold(self):
+ self.checkBoolean("forceBold", "postscriptForceBold")
+
+ def test_blueShift(self):
+ self.checkIntegerFloat("blueShift", "postscriptBlueShift")
+
+ def test_defaultWidthX(self):
+ self.checkIntegerFloat("defaultWidthX", "postscriptDefaultWidthX")
+
+ def test_nominalWidthX(self):
+ self.checkIntegerFloat("nominalWidthX", "postscriptNominalWidthX")
+
+ def test_underlineThickness(self):
+ self.checkIntegerFloat(
+ "underlineThickness", "postscriptUnderlineThickness")
+
+ def test_underlinePosition(self):
+ self.checkIntegerFloat(
+ "underlinePosition", "postscriptUnderlinePosition")
+
+ def test_slantAngle(self):
+ self.checkIntegerFloat("slantAngle", "postscriptSlantAngle")
+
+ def test_isFixedPitch(self):
+ self.checkBoolean("isFixedPitch", "postscriptIsFixedPitch")
+
+ def test_defaultCharacter(self):
+ self.checkString("defaultCharacter", "postscriptDefaultCharacter")
+
+ # TODO: test_windowsCharacterSet
+
+
+if __name__ == "__main__":
+ unittest.main()