diff options
Diffstat (limited to 'tests/defconQt')
| -rw-r--r-- | tests/defconQt/fontInfo_test.py | 597 |
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() |
