xref: /aosp_15_r20/external/fonttools/Tests/ufoLib/GLIF1_test.py (revision e1fe3e4ad2793916b15cccdc4a7da52a7e1dd0e9)
1*e1fe3e4aSElliott Hughesimport unittest
2*e1fe3e4aSElliott Hughesfrom fontTools.ufoLib.glifLib import (
3*e1fe3e4aSElliott Hughes    GlifLibError,
4*e1fe3e4aSElliott Hughes    readGlyphFromString,
5*e1fe3e4aSElliott Hughes    writeGlyphToString,
6*e1fe3e4aSElliott Hughes)
7*e1fe3e4aSElliott Hughesfrom .testSupport import Glyph, stripText
8*e1fe3e4aSElliott Hughesfrom itertools import islice
9*e1fe3e4aSElliott Hughes
10*e1fe3e4aSElliott Hughes# ----------
11*e1fe3e4aSElliott Hughes# Test Cases
12*e1fe3e4aSElliott Hughes# ----------
13*e1fe3e4aSElliott Hughes
14*e1fe3e4aSElliott Hughes
15*e1fe3e4aSElliott Hughesclass TestGLIF1(unittest.TestCase):
16*e1fe3e4aSElliott Hughes    def assertEqual(self, first, second, msg=None):
17*e1fe3e4aSElliott Hughes        if isinstance(first, str):
18*e1fe3e4aSElliott Hughes            first = stripText(first)
19*e1fe3e4aSElliott Hughes        if isinstance(second, str):
20*e1fe3e4aSElliott Hughes            second = stripText(second)
21*e1fe3e4aSElliott Hughes        return super().assertEqual(first, second, msg=msg)
22*e1fe3e4aSElliott Hughes
23*e1fe3e4aSElliott Hughes    def pyToGLIF(self, py):
24*e1fe3e4aSElliott Hughes        py = stripText(py)
25*e1fe3e4aSElliott Hughes        glyph = Glyph()
26*e1fe3e4aSElliott Hughes        exec(py, {"glyph": glyph, "pointPen": glyph})
27*e1fe3e4aSElliott Hughes        glif = writeGlyphToString(
28*e1fe3e4aSElliott Hughes            glyph.name,
29*e1fe3e4aSElliott Hughes            glyphObject=glyph,
30*e1fe3e4aSElliott Hughes            drawPointsFunc=glyph.drawPoints,
31*e1fe3e4aSElliott Hughes            formatVersion=1,
32*e1fe3e4aSElliott Hughes            validate=True,
33*e1fe3e4aSElliott Hughes        )
34*e1fe3e4aSElliott Hughes        # discard the first line containing the xml declaration
35*e1fe3e4aSElliott Hughes        return "\n".join(islice(glif.splitlines(), 1, None))
36*e1fe3e4aSElliott Hughes
37*e1fe3e4aSElliott Hughes    def glifToPy(self, glif):
38*e1fe3e4aSElliott Hughes        glif = stripText(glif)
39*e1fe3e4aSElliott Hughes        glif = '<?xml version="1.0"?>\n' + glif
40*e1fe3e4aSElliott Hughes        glyph = Glyph()
41*e1fe3e4aSElliott Hughes        readGlyphFromString(glif, glyphObject=glyph, pointPen=glyph, validate=True)
42*e1fe3e4aSElliott Hughes        return glyph.py()
43*e1fe3e4aSElliott Hughes
44*e1fe3e4aSElliott Hughes    def testTopElement(self):
45*e1fe3e4aSElliott Hughes        # not glyph
46*e1fe3e4aSElliott Hughes        glif = """
47*e1fe3e4aSElliott Hughes		<notglyph name="a" format="1">
48*e1fe3e4aSElliott Hughes			<outline>
49*e1fe3e4aSElliott Hughes			</outline>
50*e1fe3e4aSElliott Hughes		</notglyph>
51*e1fe3e4aSElliott Hughes		"""
52*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
53*e1fe3e4aSElliott Hughes
54*e1fe3e4aSElliott Hughes    def testName_legal(self):
55*e1fe3e4aSElliott Hughes        # legal
56*e1fe3e4aSElliott Hughes        glif = """
57*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
58*e1fe3e4aSElliott Hughes			<outline>
59*e1fe3e4aSElliott Hughes			</outline>
60*e1fe3e4aSElliott Hughes		</glyph>
61*e1fe3e4aSElliott Hughes		"""
62*e1fe3e4aSElliott Hughes        py = """
63*e1fe3e4aSElliott Hughes		glyph.name = "a"
64*e1fe3e4aSElliott Hughes		"""
65*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
66*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
67*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
68*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
69*e1fe3e4aSElliott Hughes
70*e1fe3e4aSElliott Hughes    def testName_empty(self):
71*e1fe3e4aSElliott Hughes        # empty
72*e1fe3e4aSElliott Hughes        glif = """
73*e1fe3e4aSElliott Hughes		<glyph name="" format="1">
74*e1fe3e4aSElliott Hughes			<outline>
75*e1fe3e4aSElliott Hughes			</outline>
76*e1fe3e4aSElliott Hughes		</glyph>
77*e1fe3e4aSElliott Hughes		"""
78*e1fe3e4aSElliott Hughes        py = """
79*e1fe3e4aSElliott Hughes		glyph.name = ""
80*e1fe3e4aSElliott Hughes		"""
81*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.pyToGLIF, py)
82*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
83*e1fe3e4aSElliott Hughes
84*e1fe3e4aSElliott Hughes    def testName_not_a_string(self):
85*e1fe3e4aSElliott Hughes        # not a string
86*e1fe3e4aSElliott Hughes        py = """
87*e1fe3e4aSElliott Hughes		glyph.name = 1
88*e1fe3e4aSElliott Hughes		"""
89*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.pyToGLIF, py)
90*e1fe3e4aSElliott Hughes
91*e1fe3e4aSElliott Hughes    def testFormat_legal(self):
92*e1fe3e4aSElliott Hughes        # legal
93*e1fe3e4aSElliott Hughes        glif = """
94*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
95*e1fe3e4aSElliott Hughes			<outline>
96*e1fe3e4aSElliott Hughes			</outline>
97*e1fe3e4aSElliott Hughes		</glyph>
98*e1fe3e4aSElliott Hughes		"""
99*e1fe3e4aSElliott Hughes        py = """
100*e1fe3e4aSElliott Hughes		glyph.name = "a"
101*e1fe3e4aSElliott Hughes		"""
102*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
103*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
104*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
105*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
106*e1fe3e4aSElliott Hughes
107*e1fe3e4aSElliott Hughes    def testFormat_wrong_number(self):
108*e1fe3e4aSElliott Hughes        # wrong number
109*e1fe3e4aSElliott Hughes        glif = """
110*e1fe3e4aSElliott Hughes		<glyph name="a" format="-1">
111*e1fe3e4aSElliott Hughes			<outline>
112*e1fe3e4aSElliott Hughes			</outline>
113*e1fe3e4aSElliott Hughes		</glyph>
114*e1fe3e4aSElliott Hughes		"""
115*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
116*e1fe3e4aSElliott Hughes
117*e1fe3e4aSElliott Hughes    def testFormat_not_an_int(self):
118*e1fe3e4aSElliott Hughes        # not an int
119*e1fe3e4aSElliott Hughes        glif = """
120*e1fe3e4aSElliott Hughes		<glyph name="a" format="A">
121*e1fe3e4aSElliott Hughes			<outline>
122*e1fe3e4aSElliott Hughes			</outline>
123*e1fe3e4aSElliott Hughes		</glyph>
124*e1fe3e4aSElliott Hughes		"""
125*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
126*e1fe3e4aSElliott Hughes
127*e1fe3e4aSElliott Hughes    def testBogusGlyphStructure_unknown_element(self):
128*e1fe3e4aSElliott Hughes        # unknown element
129*e1fe3e4aSElliott Hughes        glif = """
130*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
131*e1fe3e4aSElliott Hughes			<unknown />
132*e1fe3e4aSElliott Hughes		</glyph>
133*e1fe3e4aSElliott Hughes		"""
134*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
135*e1fe3e4aSElliott Hughes
136*e1fe3e4aSElliott Hughes    def testBogusGlyphStructure_content(self):
137*e1fe3e4aSElliott Hughes        # content
138*e1fe3e4aSElliott Hughes        glif = """
139*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
140*e1fe3e4aSElliott Hughes			Hello World.
141*e1fe3e4aSElliott Hughes		</glyph>
142*e1fe3e4aSElliott Hughes		"""
143*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
144*e1fe3e4aSElliott Hughes
145*e1fe3e4aSElliott Hughes    def testAdvance_legal_width_and_height(self):
146*e1fe3e4aSElliott Hughes        # legal: width and height
147*e1fe3e4aSElliott Hughes        glif = """
148*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
149*e1fe3e4aSElliott Hughes			<advance height="200" width="100"/>
150*e1fe3e4aSElliott Hughes			<outline>
151*e1fe3e4aSElliott Hughes			</outline>
152*e1fe3e4aSElliott Hughes		</glyph>
153*e1fe3e4aSElliott Hughes		"""
154*e1fe3e4aSElliott Hughes        py = """
155*e1fe3e4aSElliott Hughes		glyph.name = "a"
156*e1fe3e4aSElliott Hughes		glyph.width = 100
157*e1fe3e4aSElliott Hughes		glyph.height = 200
158*e1fe3e4aSElliott Hughes		"""
159*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
160*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
161*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
162*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
163*e1fe3e4aSElliott Hughes
164*e1fe3e4aSElliott Hughes    def testAdvance_legal_width_and_height_floats(self):
165*e1fe3e4aSElliott Hughes        # legal: width and height floats
166*e1fe3e4aSElliott Hughes        glif = """
167*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
168*e1fe3e4aSElliott Hughes			<advance height="200.1" width="100.1"/>
169*e1fe3e4aSElliott Hughes			<outline>
170*e1fe3e4aSElliott Hughes			</outline>
171*e1fe3e4aSElliott Hughes		</glyph>
172*e1fe3e4aSElliott Hughes		"""
173*e1fe3e4aSElliott Hughes        py = """
174*e1fe3e4aSElliott Hughes		glyph.name = "a"
175*e1fe3e4aSElliott Hughes		glyph.width = 100.1
176*e1fe3e4aSElliott Hughes		glyph.height = 200.1
177*e1fe3e4aSElliott Hughes		"""
178*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
179*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
180*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
181*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
182*e1fe3e4aSElliott Hughes
183*e1fe3e4aSElliott Hughes    def testAdvance_legal_width(self):
184*e1fe3e4aSElliott Hughes        # legal: width
185*e1fe3e4aSElliott Hughes        glif = """
186*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
187*e1fe3e4aSElliott Hughes			<advance width="100"/>
188*e1fe3e4aSElliott Hughes			<outline>
189*e1fe3e4aSElliott Hughes			</outline>
190*e1fe3e4aSElliott Hughes		</glyph>
191*e1fe3e4aSElliott Hughes		"""
192*e1fe3e4aSElliott Hughes        py = """
193*e1fe3e4aSElliott Hughes		glyph.name = "a"
194*e1fe3e4aSElliott Hughes		glyph.width = 100
195*e1fe3e4aSElliott Hughes		"""
196*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
197*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
198*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
199*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
200*e1fe3e4aSElliott Hughes
201*e1fe3e4aSElliott Hughes    def testAdvance_legal_height(self):
202*e1fe3e4aSElliott Hughes        # legal: height
203*e1fe3e4aSElliott Hughes        glif = """
204*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
205*e1fe3e4aSElliott Hughes			<advance height="200"/>
206*e1fe3e4aSElliott Hughes			<outline>
207*e1fe3e4aSElliott Hughes			</outline>
208*e1fe3e4aSElliott Hughes		</glyph>
209*e1fe3e4aSElliott Hughes		"""
210*e1fe3e4aSElliott Hughes        py = """
211*e1fe3e4aSElliott Hughes		glyph.name = "a"
212*e1fe3e4aSElliott Hughes		glyph.height = 200
213*e1fe3e4aSElliott Hughes		"""
214*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
215*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
216*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
217*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
218*e1fe3e4aSElliott Hughes
219*e1fe3e4aSElliott Hughes    def testAdvance_illegal_width(self):
220*e1fe3e4aSElliott Hughes        # illegal: not a number
221*e1fe3e4aSElliott Hughes        glif = """
222*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
223*e1fe3e4aSElliott Hughes			<advance width="a"/>
224*e1fe3e4aSElliott Hughes			<outline>
225*e1fe3e4aSElliott Hughes			</outline>
226*e1fe3e4aSElliott Hughes		</glyph>
227*e1fe3e4aSElliott Hughes		"""
228*e1fe3e4aSElliott Hughes        py = """
229*e1fe3e4aSElliott Hughes		glyph.name = "a"
230*e1fe3e4aSElliott Hughes		glyph.width = "a"
231*e1fe3e4aSElliott Hughes		"""
232*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.pyToGLIF, py)
233*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
234*e1fe3e4aSElliott Hughes
235*e1fe3e4aSElliott Hughes    def testAdvance_illegal_height(self):
236*e1fe3e4aSElliott Hughes        glif = """
237*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
238*e1fe3e4aSElliott Hughes			<advance height="a"/>
239*e1fe3e4aSElliott Hughes			<outline>
240*e1fe3e4aSElliott Hughes			</outline>
241*e1fe3e4aSElliott Hughes		</glyph>
242*e1fe3e4aSElliott Hughes		"""
243*e1fe3e4aSElliott Hughes        py = """
244*e1fe3e4aSElliott Hughes		glyph.name = "a"
245*e1fe3e4aSElliott Hughes		glyph.height = "a"
246*e1fe3e4aSElliott Hughes		"""
247*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.pyToGLIF, py)
248*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
249*e1fe3e4aSElliott Hughes
250*e1fe3e4aSElliott Hughes    def testUnicodes_legal(self):
251*e1fe3e4aSElliott Hughes        # legal
252*e1fe3e4aSElliott Hughes        glif = """
253*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
254*e1fe3e4aSElliott Hughes			<unicode hex="0061"/>
255*e1fe3e4aSElliott Hughes			<outline>
256*e1fe3e4aSElliott Hughes			</outline>
257*e1fe3e4aSElliott Hughes		</glyph>
258*e1fe3e4aSElliott Hughes		"""
259*e1fe3e4aSElliott Hughes        py = """
260*e1fe3e4aSElliott Hughes		glyph.name = "a"
261*e1fe3e4aSElliott Hughes		glyph.unicodes = [97]
262*e1fe3e4aSElliott Hughes		"""
263*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
264*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
265*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
266*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
267*e1fe3e4aSElliott Hughes
268*e1fe3e4aSElliott Hughes    def testUnicodes_legal_multiple(self):
269*e1fe3e4aSElliott Hughes        glif = """
270*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
271*e1fe3e4aSElliott Hughes			<unicode hex="0062"/>
272*e1fe3e4aSElliott Hughes			<unicode hex="0063"/>
273*e1fe3e4aSElliott Hughes			<unicode hex="0061"/>
274*e1fe3e4aSElliott Hughes			<outline>
275*e1fe3e4aSElliott Hughes			</outline>
276*e1fe3e4aSElliott Hughes		</glyph>
277*e1fe3e4aSElliott Hughes		"""
278*e1fe3e4aSElliott Hughes        py = """
279*e1fe3e4aSElliott Hughes		glyph.name = "a"
280*e1fe3e4aSElliott Hughes		glyph.unicodes = [98, 99, 97]
281*e1fe3e4aSElliott Hughes		"""
282*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
283*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
284*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
285*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
286*e1fe3e4aSElliott Hughes
287*e1fe3e4aSElliott Hughes    def testUnicodes_illegal(self):
288*e1fe3e4aSElliott Hughes        # illegal
289*e1fe3e4aSElliott Hughes        glif = """
290*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
291*e1fe3e4aSElliott Hughes			<unicode hex="1.1"/>
292*e1fe3e4aSElliott Hughes			<outline>
293*e1fe3e4aSElliott Hughes			</outline>
294*e1fe3e4aSElliott Hughes		</glyph>
295*e1fe3e4aSElliott Hughes		"""
296*e1fe3e4aSElliott Hughes        py = """
297*e1fe3e4aSElliott Hughes		glyph.name = "zzzzzz"
298*e1fe3e4aSElliott Hughes		glyph.unicodes = ["1.1"]
299*e1fe3e4aSElliott Hughes		"""
300*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.pyToGLIF, py)
301*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
302*e1fe3e4aSElliott Hughes
303*e1fe3e4aSElliott Hughes    def testNote(self):
304*e1fe3e4aSElliott Hughes        glif = """
305*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
306*e1fe3e4aSElliott Hughes			<note>
307*e1fe3e4aSElliott Hughes				\U0001F4A9
308*e1fe3e4aSElliott Hughes			</note>
309*e1fe3e4aSElliott Hughes			<outline>
310*e1fe3e4aSElliott Hughes			</outline>
311*e1fe3e4aSElliott Hughes		</glyph>
312*e1fe3e4aSElliott Hughes		"""
313*e1fe3e4aSElliott Hughes        py = """
314*e1fe3e4aSElliott Hughes		glyph.name = "a"
315*e1fe3e4aSElliott Hughes		glyph.note = "��"
316*e1fe3e4aSElliott Hughes		"""
317*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
318*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
319*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
320*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
321*e1fe3e4aSElliott Hughes
322*e1fe3e4aSElliott Hughes    def testLib_legal(self):
323*e1fe3e4aSElliott Hughes        glif = """
324*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
325*e1fe3e4aSElliott Hughes			<outline>
326*e1fe3e4aSElliott Hughes			</outline>
327*e1fe3e4aSElliott Hughes			<lib>
328*e1fe3e4aSElliott Hughes				<dict>
329*e1fe3e4aSElliott Hughes					<key>dict</key>
330*e1fe3e4aSElliott Hughes					<dict>
331*e1fe3e4aSElliott Hughes						<key>hello</key>
332*e1fe3e4aSElliott Hughes						<string>world</string>
333*e1fe3e4aSElliott Hughes					</dict>
334*e1fe3e4aSElliott Hughes					<key>float</key>
335*e1fe3e4aSElliott Hughes					<real>2.5</real>
336*e1fe3e4aSElliott Hughes					<key>int</key>
337*e1fe3e4aSElliott Hughes					<integer>1</integer>
338*e1fe3e4aSElliott Hughes					<key>list</key>
339*e1fe3e4aSElliott Hughes					<array>
340*e1fe3e4aSElliott Hughes						<string>a</string>
341*e1fe3e4aSElliott Hughes						<string>b</string>
342*e1fe3e4aSElliott Hughes						<integer>1</integer>
343*e1fe3e4aSElliott Hughes						<real>2.5</real>
344*e1fe3e4aSElliott Hughes					</array>
345*e1fe3e4aSElliott Hughes					<key>string</key>
346*e1fe3e4aSElliott Hughes					<string>a</string>
347*e1fe3e4aSElliott Hughes				</dict>
348*e1fe3e4aSElliott Hughes			</lib>
349*e1fe3e4aSElliott Hughes		</glyph>
350*e1fe3e4aSElliott Hughes		"""
351*e1fe3e4aSElliott Hughes        py = """
352*e1fe3e4aSElliott Hughes		glyph.name = "a"
353*e1fe3e4aSElliott Hughes		glyph.lib = {"dict" : {"hello" : "world"}, "float" : 2.5, "int" : 1, "list" : ["a", "b", 1, 2.5], "string" : "a"}
354*e1fe3e4aSElliott Hughes		"""
355*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
356*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
357*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
358*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
359*e1fe3e4aSElliott Hughes
360*e1fe3e4aSElliott Hughes    def testOutline_unknown_element(self):
361*e1fe3e4aSElliott Hughes        # unknown element
362*e1fe3e4aSElliott Hughes        glif = """
363*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
364*e1fe3e4aSElliott Hughes			<outline>
365*e1fe3e4aSElliott Hughes				<unknown/>
366*e1fe3e4aSElliott Hughes			</outline>
367*e1fe3e4aSElliott Hughes		</glyph>
368*e1fe3e4aSElliott Hughes		"""
369*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
370*e1fe3e4aSElliott Hughes
371*e1fe3e4aSElliott Hughes    def testOutline_content(self):
372*e1fe3e4aSElliott Hughes        # content
373*e1fe3e4aSElliott Hughes        glif = """
374*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
375*e1fe3e4aSElliott Hughes			<outline>
376*e1fe3e4aSElliott Hughes				hello
377*e1fe3e4aSElliott Hughes			</outline>
378*e1fe3e4aSElliott Hughes		</glyph>
379*e1fe3e4aSElliott Hughes		"""
380*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
381*e1fe3e4aSElliott Hughes
382*e1fe3e4aSElliott Hughes    def testComponent_legal(self):
383*e1fe3e4aSElliott Hughes        # legal
384*e1fe3e4aSElliott Hughes        glif = """
385*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
386*e1fe3e4aSElliott Hughes			<outline>
387*e1fe3e4aSElliott Hughes				<component base="x" xScale="2" xyScale="3" yxScale="6" yScale="5" xOffset="1" yOffset="4"/>
388*e1fe3e4aSElliott Hughes			</outline>
389*e1fe3e4aSElliott Hughes		</glyph>
390*e1fe3e4aSElliott Hughes		"""
391*e1fe3e4aSElliott Hughes        py = """
392*e1fe3e4aSElliott Hughes		glyph.name = "a"
393*e1fe3e4aSElliott Hughes		pointPen.addComponent(*["x", (2, 3, 6, 5, 1, 4)])
394*e1fe3e4aSElliott Hughes		"""
395*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
396*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
397*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
398*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
399*e1fe3e4aSElliott Hughes
400*e1fe3e4aSElliott Hughes    def testComponent_illegal_no_base(self):
401*e1fe3e4aSElliott Hughes        # no base
402*e1fe3e4aSElliott Hughes        glif = """
403*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
404*e1fe3e4aSElliott Hughes			<outline>
405*e1fe3e4aSElliott Hughes				<component xScale="2" xyScale="3" yxScale="6" yScale="5" xOffset="1" yOffset="4"/>
406*e1fe3e4aSElliott Hughes			</outline>
407*e1fe3e4aSElliott Hughes		</glyph>
408*e1fe3e4aSElliott Hughes		"""
409*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
410*e1fe3e4aSElliott Hughes
411*e1fe3e4aSElliott Hughes    def testComponent_bogus_transformation(self):
412*e1fe3e4aSElliott Hughes        # bogus values in transformation
413*e1fe3e4aSElliott Hughes        glif = """
414*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
415*e1fe3e4aSElliott Hughes			<outline>
416*e1fe3e4aSElliott Hughes				<component base="x" xScale="a" xyScale="3" yxScale="6" yScale="5" xOffset="1" yOffset="4"/>
417*e1fe3e4aSElliott Hughes			</outline>
418*e1fe3e4aSElliott Hughes		</glyph>
419*e1fe3e4aSElliott Hughes		"""
420*e1fe3e4aSElliott Hughes        py = """
421*e1fe3e4aSElliott Hughes		glyph.name = "a"
422*e1fe3e4aSElliott Hughes		pointPen.addComponent(*["x", ("a", 3, 6, 5, 1, 4)])
423*e1fe3e4aSElliott Hughes		"""
424*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.pyToGLIF, py)
425*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
426*e1fe3e4aSElliott Hughes        glif = """
427*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
428*e1fe3e4aSElliott Hughes			<outline>
429*e1fe3e4aSElliott Hughes				<component base="x" xScale="a" xyScale="3" yxScale="6" yScale="5" xOffset="1" yOffset="4"/>
430*e1fe3e4aSElliott Hughes			</outline>
431*e1fe3e4aSElliott Hughes		</glyph>
432*e1fe3e4aSElliott Hughes		"""
433*e1fe3e4aSElliott Hughes        py = """
434*e1fe3e4aSElliott Hughes		glyph.name = "a"
435*e1fe3e4aSElliott Hughes		pointPen.addComponent(*["x", (2, "a", 6, 5, 1, 4)])
436*e1fe3e4aSElliott Hughes		"""
437*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.pyToGLIF, py)
438*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
439*e1fe3e4aSElliott Hughes        glif = """
440*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
441*e1fe3e4aSElliott Hughes			<outline>
442*e1fe3e4aSElliott Hughes				<component base="x" xScale="2" xyScale="3" yxScale="a" yScale="5" xOffset="1" yOffset="4"/>
443*e1fe3e4aSElliott Hughes			</outline>
444*e1fe3e4aSElliott Hughes		</glyph>
445*e1fe3e4aSElliott Hughes		"""
446*e1fe3e4aSElliott Hughes        py = """
447*e1fe3e4aSElliott Hughes		glyph.name = "a"
448*e1fe3e4aSElliott Hughes		pointPen.addComponent(*["x", (2, 3, "a", 5, 1, 4)])
449*e1fe3e4aSElliott Hughes		"""
450*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.pyToGLIF, py)
451*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
452*e1fe3e4aSElliott Hughes        glif = """
453*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
454*e1fe3e4aSElliott Hughes			<outline>
455*e1fe3e4aSElliott Hughes				<component base="x" xScale="2" xyScale="3" yxScale="6" yScale="a" xOffset="1" yOffset="4"/>
456*e1fe3e4aSElliott Hughes			</outline>
457*e1fe3e4aSElliott Hughes		</glyph>
458*e1fe3e4aSElliott Hughes		"""
459*e1fe3e4aSElliott Hughes        py = """
460*e1fe3e4aSElliott Hughes		glyph.name = "a"
461*e1fe3e4aSElliott Hughes		pointPen.addComponent(*["x", (2, 3, 6, "a", 1, 4)])
462*e1fe3e4aSElliott Hughes		"""
463*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.pyToGLIF, py)
464*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
465*e1fe3e4aSElliott Hughes        glif = """
466*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
467*e1fe3e4aSElliott Hughes			<outline>
468*e1fe3e4aSElliott Hughes				<component base="x" xScale="2" xyScale="3" yxScale="6" yScale="5" xOffset="a" yOffset="4"/>
469*e1fe3e4aSElliott Hughes			</outline>
470*e1fe3e4aSElliott Hughes		</glyph>
471*e1fe3e4aSElliott Hughes		"""
472*e1fe3e4aSElliott Hughes        py = """
473*e1fe3e4aSElliott Hughes		glyph.name = "a"
474*e1fe3e4aSElliott Hughes		pointPen.addComponent(*["x", (2, 3, 6, 5, "a", 4)])
475*e1fe3e4aSElliott Hughes		"""
476*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.pyToGLIF, py)
477*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
478*e1fe3e4aSElliott Hughes        glif = """
479*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
480*e1fe3e4aSElliott Hughes			<outline>
481*e1fe3e4aSElliott Hughes				<component base="x" xScale="2" xyScale="3" yxScale="6" yScale="5" xOffset="1" yOffset="a"/>
482*e1fe3e4aSElliott Hughes			</outline>
483*e1fe3e4aSElliott Hughes		</glyph>
484*e1fe3e4aSElliott Hughes		"""
485*e1fe3e4aSElliott Hughes        py = """
486*e1fe3e4aSElliott Hughes		glyph.name = "a"
487*e1fe3e4aSElliott Hughes		pointPen.addComponent(*["x", (2, 3, 6, 5, 1, "a")])
488*e1fe3e4aSElliott Hughes		"""
489*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.pyToGLIF, py)
490*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
491*e1fe3e4aSElliott Hughes
492*e1fe3e4aSElliott Hughes    def testContour_legal_one_contour(self):
493*e1fe3e4aSElliott Hughes        # legal: one contour
494*e1fe3e4aSElliott Hughes        glif = """
495*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
496*e1fe3e4aSElliott Hughes			<outline>
497*e1fe3e4aSElliott Hughes				<contour>
498*e1fe3e4aSElliott Hughes				</contour>
499*e1fe3e4aSElliott Hughes			</outline>
500*e1fe3e4aSElliott Hughes		</glyph>
501*e1fe3e4aSElliott Hughes		"""
502*e1fe3e4aSElliott Hughes        py = """
503*e1fe3e4aSElliott Hughes		glyph.name = "a"
504*e1fe3e4aSElliott Hughes		pointPen.beginPath()
505*e1fe3e4aSElliott Hughes		pointPen.endPath()
506*e1fe3e4aSElliott Hughes		"""
507*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
508*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
509*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
510*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
511*e1fe3e4aSElliott Hughes
512*e1fe3e4aSElliott Hughes    def testContour_legal_two_contours(self):
513*e1fe3e4aSElliott Hughes        # legal: two contours
514*e1fe3e4aSElliott Hughes        glif = """
515*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
516*e1fe3e4aSElliott Hughes			<outline>
517*e1fe3e4aSElliott Hughes				<contour>
518*e1fe3e4aSElliott Hughes					<point x="1" y="2" type="move"/>
519*e1fe3e4aSElliott Hughes					<point x="10" y="20" type="line"/>
520*e1fe3e4aSElliott Hughes				</contour>
521*e1fe3e4aSElliott Hughes				<contour>
522*e1fe3e4aSElliott Hughes					<point x="1" y="2" type="move"/>
523*e1fe3e4aSElliott Hughes					<point x="10" y="20" type="line"/>
524*e1fe3e4aSElliott Hughes				</contour>
525*e1fe3e4aSElliott Hughes			</outline>
526*e1fe3e4aSElliott Hughes		</glyph>
527*e1fe3e4aSElliott Hughes		"""
528*e1fe3e4aSElliott Hughes        py = """
529*e1fe3e4aSElliott Hughes		glyph.name = "a"
530*e1fe3e4aSElliott Hughes		pointPen.beginPath()
531*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1, 2)], **{"segmentType" : "move", "smooth" : False})
532*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(10, 20)], **{"segmentType" : "line", "smooth" : False})
533*e1fe3e4aSElliott Hughes		pointPen.endPath()
534*e1fe3e4aSElliott Hughes		pointPen.beginPath()
535*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1, 2)], **{"segmentType" : "move", "smooth" : False})
536*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(10, 20)], **{"segmentType" : "line", "smooth" : False})
537*e1fe3e4aSElliott Hughes		pointPen.endPath()
538*e1fe3e4aSElliott Hughes		"""
539*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
540*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
541*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
542*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
543*e1fe3e4aSElliott Hughes
544*e1fe3e4aSElliott Hughes    def testContour_illegal_unkonwn_element(self):
545*e1fe3e4aSElliott Hughes        # unknown element
546*e1fe3e4aSElliott Hughes        glif = """
547*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
548*e1fe3e4aSElliott Hughes			<outline>
549*e1fe3e4aSElliott Hughes				<contour>
550*e1fe3e4aSElliott Hughes					<unknown/>
551*e1fe3e4aSElliott Hughes				</contour>
552*e1fe3e4aSElliott Hughes			</outline>
553*e1fe3e4aSElliott Hughes		</glyph>
554*e1fe3e4aSElliott Hughes		"""
555*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
556*e1fe3e4aSElliott Hughes
557*e1fe3e4aSElliott Hughes    def testPointCoordinates_legal_int(self):
558*e1fe3e4aSElliott Hughes        # legal: int
559*e1fe3e4aSElliott Hughes        glif = """
560*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
561*e1fe3e4aSElliott Hughes			<outline>
562*e1fe3e4aSElliott Hughes				<contour>
563*e1fe3e4aSElliott Hughes					<point x="1" y="-2" type="move"/>
564*e1fe3e4aSElliott Hughes					<point x="0" y="0" type="line" name="this is here so that the contour isn't seen as an anchor"/>
565*e1fe3e4aSElliott Hughes				</contour>
566*e1fe3e4aSElliott Hughes			</outline>
567*e1fe3e4aSElliott Hughes		</glyph>
568*e1fe3e4aSElliott Hughes		"""
569*e1fe3e4aSElliott Hughes        py = """
570*e1fe3e4aSElliott Hughes		glyph.name = "a"
571*e1fe3e4aSElliott Hughes		pointPen.beginPath()
572*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1, -2)], **{"segmentType" : "move", "smooth" : False})
573*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 0)], **{"name" : "this is here so that the contour isn't seen as an anchor", "segmentType" : "line", "smooth" : False})
574*e1fe3e4aSElliott Hughes		pointPen.endPath()
575*e1fe3e4aSElliott Hughes		"""
576*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
577*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
578*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
579*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
580*e1fe3e4aSElliott Hughes
581*e1fe3e4aSElliott Hughes    def testPointCoordinates_legal_float(self):
582*e1fe3e4aSElliott Hughes        # legal: float
583*e1fe3e4aSElliott Hughes        glif = """
584*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
585*e1fe3e4aSElliott Hughes			<outline>
586*e1fe3e4aSElliott Hughes				<contour>
587*e1fe3e4aSElliott Hughes					<point x="1.1" y="-2.2" type="move"/>
588*e1fe3e4aSElliott Hughes					<point x="0" y="0" type="line" name="this is here so that the contour isn't seen as an anchor"/>
589*e1fe3e4aSElliott Hughes				</contour>
590*e1fe3e4aSElliott Hughes			</outline>
591*e1fe3e4aSElliott Hughes		</glyph>
592*e1fe3e4aSElliott Hughes		"""
593*e1fe3e4aSElliott Hughes        py = """
594*e1fe3e4aSElliott Hughes		glyph.name = "a"
595*e1fe3e4aSElliott Hughes		pointPen.beginPath()
596*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1.1, -2.2)], **{"segmentType" : "move", "smooth" : False})
597*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 0)], **{"name" : "this is here so that the contour isn't seen as an anchor", "segmentType" : "line", "smooth" : False})
598*e1fe3e4aSElliott Hughes		pointPen.endPath()
599*e1fe3e4aSElliott Hughes		"""
600*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
601*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
602*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
603*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
604*e1fe3e4aSElliott Hughes
605*e1fe3e4aSElliott Hughes    def testPointCoordinates_illegal_x(self):
606*e1fe3e4aSElliott Hughes        # illegal: string
607*e1fe3e4aSElliott Hughes        glif = """
608*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
609*e1fe3e4aSElliott Hughes			<outline>
610*e1fe3e4aSElliott Hughes				<contour>
611*e1fe3e4aSElliott Hughes					<point x="a" y="2" type="move"/>
612*e1fe3e4aSElliott Hughes					<point x="0" y="0" type="line" name="this is here so that the contour isn't seen as an anchor"/>
613*e1fe3e4aSElliott Hughes				</contour>
614*e1fe3e4aSElliott Hughes			</outline>
615*e1fe3e4aSElliott Hughes		</glyph>
616*e1fe3e4aSElliott Hughes		"""
617*e1fe3e4aSElliott Hughes        py = """
618*e1fe3e4aSElliott Hughes		glyph.name = "a"
619*e1fe3e4aSElliott Hughes		pointPen.beginPath()
620*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[("a", 2)], **{"segmentType" : "move", "smooth" : False})
621*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 0)], **{"name" : "this is here so that the contour isn't seen as an anchor", "segmentType" : "line", "smooth" : False})
622*e1fe3e4aSElliott Hughes		pointPen.endPath()
623*e1fe3e4aSElliott Hughes		"""
624*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.pyToGLIF, py)
625*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
626*e1fe3e4aSElliott Hughes
627*e1fe3e4aSElliott Hughes    def testPointCoordinates_illegal_y(self):
628*e1fe3e4aSElliott Hughes        # legal: int
629*e1fe3e4aSElliott Hughes        glif = """
630*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
631*e1fe3e4aSElliott Hughes			<outline>
632*e1fe3e4aSElliott Hughes				<contour>
633*e1fe3e4aSElliott Hughes					<point x="1" y="a" type="move"/>
634*e1fe3e4aSElliott Hughes					<point x="0" y="0" type="line" name="this is here so that the contour isn't seen as an anchor"/>
635*e1fe3e4aSElliott Hughes				</contour>
636*e1fe3e4aSElliott Hughes			</outline>
637*e1fe3e4aSElliott Hughes		</glyph>
638*e1fe3e4aSElliott Hughes		"""
639*e1fe3e4aSElliott Hughes        py = """
640*e1fe3e4aSElliott Hughes		glyph.name = "a"
641*e1fe3e4aSElliott Hughes		pointPen.beginPath()
642*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1, "a")], **{"segmentType" : "move", "smooth" : False})
643*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 0)], **{"name" : "this is here so that the contour isn't seen as an anchor", "segmentType" : "line", "smooth" : False})
644*e1fe3e4aSElliott Hughes		pointPen.endPath()
645*e1fe3e4aSElliott Hughes		"""
646*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.pyToGLIF, py)
647*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
648*e1fe3e4aSElliott Hughes
649*e1fe3e4aSElliott Hughes    def testPointTypeMove_legal(self):
650*e1fe3e4aSElliott Hughes        # legal
651*e1fe3e4aSElliott Hughes        glif = """
652*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
653*e1fe3e4aSElliott Hughes			<outline>
654*e1fe3e4aSElliott Hughes				<contour>
655*e1fe3e4aSElliott Hughes					<point x="1" y="-2" type="move"/>
656*e1fe3e4aSElliott Hughes					<point x="3" y="-4" type="line"/>
657*e1fe3e4aSElliott Hughes				</contour>
658*e1fe3e4aSElliott Hughes			</outline>
659*e1fe3e4aSElliott Hughes		</glyph>
660*e1fe3e4aSElliott Hughes		"""
661*e1fe3e4aSElliott Hughes        py = """
662*e1fe3e4aSElliott Hughes		glyph.name = "a"
663*e1fe3e4aSElliott Hughes		pointPen.beginPath()
664*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1, -2)], **{"segmentType" : "move", "smooth" : False})
665*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(3, -4)], **{"segmentType" : "line", "smooth" : False})
666*e1fe3e4aSElliott Hughes		pointPen.endPath()
667*e1fe3e4aSElliott Hughes		"""
668*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
669*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
670*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
671*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
672*e1fe3e4aSElliott Hughes
673*e1fe3e4aSElliott Hughes    def testPointTypeMove_legal_smooth(self):
674*e1fe3e4aSElliott Hughes        # legal: smooth=True
675*e1fe3e4aSElliott Hughes        glif = """
676*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
677*e1fe3e4aSElliott Hughes			<outline>
678*e1fe3e4aSElliott Hughes				<contour>
679*e1fe3e4aSElliott Hughes					<point x="1" y="-2" type="move" smooth="yes"/>
680*e1fe3e4aSElliott Hughes					<point x="3" y="-4" type="line"/>
681*e1fe3e4aSElliott Hughes				</contour>
682*e1fe3e4aSElliott Hughes			</outline>
683*e1fe3e4aSElliott Hughes		</glyph>
684*e1fe3e4aSElliott Hughes		"""
685*e1fe3e4aSElliott Hughes        py = """
686*e1fe3e4aSElliott Hughes		glyph.name = "a"
687*e1fe3e4aSElliott Hughes		pointPen.beginPath()
688*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1, -2)], **{"segmentType" : "move", "smooth" : True})
689*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(3, -4)], **{"segmentType" : "line", "smooth" : False})
690*e1fe3e4aSElliott Hughes		pointPen.endPath()
691*e1fe3e4aSElliott Hughes		"""
692*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
693*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
694*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
695*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
696*e1fe3e4aSElliott Hughes
697*e1fe3e4aSElliott Hughes    def testPointTypeMove_illegal_not_at_start(self):
698*e1fe3e4aSElliott Hughes        # illegal: not at start
699*e1fe3e4aSElliott Hughes        glif = """
700*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
701*e1fe3e4aSElliott Hughes			<outline>
702*e1fe3e4aSElliott Hughes				<contour>
703*e1fe3e4aSElliott Hughes					<point x="3" y="-4" type="line"/>
704*e1fe3e4aSElliott Hughes					<point x="1" y="-2" type="move"/>
705*e1fe3e4aSElliott Hughes				</contour>
706*e1fe3e4aSElliott Hughes			</outline>
707*e1fe3e4aSElliott Hughes		</glyph>
708*e1fe3e4aSElliott Hughes		"""
709*e1fe3e4aSElliott Hughes        py = """
710*e1fe3e4aSElliott Hughes		glyph.name = "a"
711*e1fe3e4aSElliott Hughes		pointPen.beginPath()
712*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(3, -4)], **{"segmentType" : "line", "smooth" : False})
713*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1, -2)], **{"segmentType" : "move", "smooth" : False})
714*e1fe3e4aSElliott Hughes		pointPen.endPath()
715*e1fe3e4aSElliott Hughes		"""
716*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.pyToGLIF, py)
717*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
718*e1fe3e4aSElliott Hughes
719*e1fe3e4aSElliott Hughes    def testPointTypeLine_legal(self):
720*e1fe3e4aSElliott Hughes        # legal
721*e1fe3e4aSElliott Hughes        glif = """
722*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
723*e1fe3e4aSElliott Hughes			<outline>
724*e1fe3e4aSElliott Hughes				<contour>
725*e1fe3e4aSElliott Hughes					<point x="1" y="-2" type="move"/>
726*e1fe3e4aSElliott Hughes					<point x="3" y="-4" type="line"/>
727*e1fe3e4aSElliott Hughes				</contour>
728*e1fe3e4aSElliott Hughes			</outline>
729*e1fe3e4aSElliott Hughes		</glyph>
730*e1fe3e4aSElliott Hughes		"""
731*e1fe3e4aSElliott Hughes        py = """
732*e1fe3e4aSElliott Hughes		glyph.name = "a"
733*e1fe3e4aSElliott Hughes		pointPen.beginPath()
734*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1, -2)], **{"segmentType" : "move", "smooth" : False})
735*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(3, -4)], **{"segmentType" : "line", "smooth" : False})
736*e1fe3e4aSElliott Hughes		pointPen.endPath()
737*e1fe3e4aSElliott Hughes		"""
738*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
739*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
740*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
741*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
742*e1fe3e4aSElliott Hughes
743*e1fe3e4aSElliott Hughes    def testPointTypeLine_legal_start_of_contour(self):
744*e1fe3e4aSElliott Hughes        # legal: start of contour
745*e1fe3e4aSElliott Hughes        glif = """
746*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
747*e1fe3e4aSElliott Hughes			<outline>
748*e1fe3e4aSElliott Hughes				<contour>
749*e1fe3e4aSElliott Hughes					<point x="1" y="-2" type="line"/>
750*e1fe3e4aSElliott Hughes					<point x="3" y="-4" type="line"/>
751*e1fe3e4aSElliott Hughes				</contour>
752*e1fe3e4aSElliott Hughes			</outline>
753*e1fe3e4aSElliott Hughes		</glyph>
754*e1fe3e4aSElliott Hughes		"""
755*e1fe3e4aSElliott Hughes        py = """
756*e1fe3e4aSElliott Hughes		glyph.name = "a"
757*e1fe3e4aSElliott Hughes		pointPen.beginPath()
758*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1, -2)], **{"segmentType" : "line", "smooth" : False})
759*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(3, -4)], **{"segmentType" : "line", "smooth" : False})
760*e1fe3e4aSElliott Hughes		pointPen.endPath()
761*e1fe3e4aSElliott Hughes		"""
762*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
763*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
764*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
765*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
766*e1fe3e4aSElliott Hughes
767*e1fe3e4aSElliott Hughes    def testPointTypeLine_legal_smooth(self):
768*e1fe3e4aSElliott Hughes        # legal: smooth=True
769*e1fe3e4aSElliott Hughes        glif = """
770*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
771*e1fe3e4aSElliott Hughes			<outline>
772*e1fe3e4aSElliott Hughes				<contour>
773*e1fe3e4aSElliott Hughes					<point x="1" y="-2" type="move"/>
774*e1fe3e4aSElliott Hughes					<point x="3" y="-4" type="line" smooth="yes"/>
775*e1fe3e4aSElliott Hughes				</contour>
776*e1fe3e4aSElliott Hughes			</outline>
777*e1fe3e4aSElliott Hughes		</glyph>
778*e1fe3e4aSElliott Hughes		"""
779*e1fe3e4aSElliott Hughes        py = """
780*e1fe3e4aSElliott Hughes		glyph.name = "a"
781*e1fe3e4aSElliott Hughes		pointPen.beginPath()
782*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1, -2)], **{"segmentType" : "move", "smooth" : False})
783*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(3, -4)], **{"segmentType" : "line", "smooth" : True})
784*e1fe3e4aSElliott Hughes		pointPen.endPath()
785*e1fe3e4aSElliott Hughes		"""
786*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
787*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
788*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
789*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
790*e1fe3e4aSElliott Hughes
791*e1fe3e4aSElliott Hughes    def testPointTypeCurve_legal(self):
792*e1fe3e4aSElliott Hughes        # legal
793*e1fe3e4aSElliott Hughes        glif = """
794*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
795*e1fe3e4aSElliott Hughes			<outline>
796*e1fe3e4aSElliott Hughes				<contour>
797*e1fe3e4aSElliott Hughes					<point x="0" y="0" type="move"/>
798*e1fe3e4aSElliott Hughes					<point x="0" y="65"/>
799*e1fe3e4aSElliott Hughes					<point x="65" y="200"/>
800*e1fe3e4aSElliott Hughes					<point x="100" y="200" type="curve"/>
801*e1fe3e4aSElliott Hughes				</contour>
802*e1fe3e4aSElliott Hughes			</outline>
803*e1fe3e4aSElliott Hughes		</glyph>
804*e1fe3e4aSElliott Hughes		"""
805*e1fe3e4aSElliott Hughes        py = """
806*e1fe3e4aSElliott Hughes		glyph.name = "a"
807*e1fe3e4aSElliott Hughes		pointPen.beginPath()
808*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False})
809*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 65)], **{"smooth" : False})
810*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(65, 200)], **{"smooth" : False})
811*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(100, 200)], **{"segmentType" : "curve", "smooth" : False})
812*e1fe3e4aSElliott Hughes		pointPen.endPath()
813*e1fe3e4aSElliott Hughes		"""
814*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
815*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
816*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
817*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
818*e1fe3e4aSElliott Hughes
819*e1fe3e4aSElliott Hughes    def testPointTypeCurve_legal_start_of_contour(self):
820*e1fe3e4aSElliott Hughes        # legal: start of contour
821*e1fe3e4aSElliott Hughes        glif = """
822*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
823*e1fe3e4aSElliott Hughes			<outline>
824*e1fe3e4aSElliott Hughes				<contour>
825*e1fe3e4aSElliott Hughes					<point x="100" y="200" type="curve"/>
826*e1fe3e4aSElliott Hughes					<point x="0" y="65"/>
827*e1fe3e4aSElliott Hughes					<point x="65" y="200"/>
828*e1fe3e4aSElliott Hughes				</contour>
829*e1fe3e4aSElliott Hughes			</outline>
830*e1fe3e4aSElliott Hughes		</glyph>
831*e1fe3e4aSElliott Hughes		"""
832*e1fe3e4aSElliott Hughes        py = """
833*e1fe3e4aSElliott Hughes		glyph.name = "a"
834*e1fe3e4aSElliott Hughes		pointPen.beginPath()
835*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(100, 200)], **{"segmentType" : "curve", "smooth" : False})
836*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 65)], **{"smooth" : False})
837*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(65, 200)], **{"smooth" : False})
838*e1fe3e4aSElliott Hughes		pointPen.endPath()
839*e1fe3e4aSElliott Hughes		"""
840*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
841*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
842*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
843*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
844*e1fe3e4aSElliott Hughes
845*e1fe3e4aSElliott Hughes    def testPointTypeCurve_legal_smooth(self):
846*e1fe3e4aSElliott Hughes        # legal: smooth=True
847*e1fe3e4aSElliott Hughes        glif = """
848*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
849*e1fe3e4aSElliott Hughes			<outline>
850*e1fe3e4aSElliott Hughes				<contour>
851*e1fe3e4aSElliott Hughes					<point x="0" y="0" type="move"/>
852*e1fe3e4aSElliott Hughes					<point x="0" y="65"/>
853*e1fe3e4aSElliott Hughes					<point x="65" y="200"/>
854*e1fe3e4aSElliott Hughes					<point x="100" y="200" type="curve" smooth="yes"/>
855*e1fe3e4aSElliott Hughes				</contour>
856*e1fe3e4aSElliott Hughes			</outline>
857*e1fe3e4aSElliott Hughes		</glyph>
858*e1fe3e4aSElliott Hughes		"""
859*e1fe3e4aSElliott Hughes        py = """
860*e1fe3e4aSElliott Hughes		glyph.name = "a"
861*e1fe3e4aSElliott Hughes		pointPen.beginPath()
862*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False})
863*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 65)], **{"smooth" : False})
864*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(65, 200)], **{"smooth" : False})
865*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(100, 200)], **{"segmentType" : "curve", "smooth" : True})
866*e1fe3e4aSElliott Hughes		pointPen.endPath()
867*e1fe3e4aSElliott Hughes		"""
868*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
869*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
870*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
871*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
872*e1fe3e4aSElliott Hughes
873*e1fe3e4aSElliott Hughes    def testPointTypeCurve_legal_no_off_curves(self):
874*e1fe3e4aSElliott Hughes        # legal: no off-curves
875*e1fe3e4aSElliott Hughes        glif = """
876*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
877*e1fe3e4aSElliott Hughes			<outline>
878*e1fe3e4aSElliott Hughes				<contour>
879*e1fe3e4aSElliott Hughes					<point x="0" y="0" type="move"/>
880*e1fe3e4aSElliott Hughes					<point x="100" y="200" type="curve"/>
881*e1fe3e4aSElliott Hughes				</contour>
882*e1fe3e4aSElliott Hughes			</outline>
883*e1fe3e4aSElliott Hughes		</glyph>
884*e1fe3e4aSElliott Hughes		"""
885*e1fe3e4aSElliott Hughes        py = """
886*e1fe3e4aSElliott Hughes		glyph.name = "a"
887*e1fe3e4aSElliott Hughes		pointPen.beginPath()
888*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False})
889*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(100, 200)], **{"segmentType" : "curve", "smooth" : False})
890*e1fe3e4aSElliott Hughes		pointPen.endPath()
891*e1fe3e4aSElliott Hughes		"""
892*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
893*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
894*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
895*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
896*e1fe3e4aSElliott Hughes
897*e1fe3e4aSElliott Hughes    def testPointTypeCurve_legal_1_off_curve(self):
898*e1fe3e4aSElliott Hughes        # legal: 1 off-curve
899*e1fe3e4aSElliott Hughes        glif = """
900*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
901*e1fe3e4aSElliott Hughes			<outline>
902*e1fe3e4aSElliott Hughes				<contour>
903*e1fe3e4aSElliott Hughes					<point x="0" y="0" type="move"/>
904*e1fe3e4aSElliott Hughes					<point x="50" y="100"/>
905*e1fe3e4aSElliott Hughes					<point x="100" y="200" type="curve"/>
906*e1fe3e4aSElliott Hughes				</contour>
907*e1fe3e4aSElliott Hughes			</outline>
908*e1fe3e4aSElliott Hughes		</glyph>
909*e1fe3e4aSElliott Hughes		"""
910*e1fe3e4aSElliott Hughes        py = """
911*e1fe3e4aSElliott Hughes		glyph.name = "a"
912*e1fe3e4aSElliott Hughes		pointPen.beginPath()
913*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False})
914*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(50, 100)], **{"smooth" : False})
915*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(100, 200)], **{"segmentType" : "curve", "smooth" : False})
916*e1fe3e4aSElliott Hughes		pointPen.endPath()
917*e1fe3e4aSElliott Hughes		"""
918*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
919*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
920*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
921*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
922*e1fe3e4aSElliott Hughes
923*e1fe3e4aSElliott Hughes    def testPointTypeCurve_illegal_3_off_curves(self):
924*e1fe3e4aSElliott Hughes        # illegal: 3 off-curves
925*e1fe3e4aSElliott Hughes        glif = """
926*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
927*e1fe3e4aSElliott Hughes			<outline>
928*e1fe3e4aSElliott Hughes				<contour>
929*e1fe3e4aSElliott Hughes					<point x="0" y="0" type="move"/>
930*e1fe3e4aSElliott Hughes					<point x="0" y="100"/>
931*e1fe3e4aSElliott Hughes					<point x="35" y="125"/>
932*e1fe3e4aSElliott Hughes					<point x="65" y="200"/>
933*e1fe3e4aSElliott Hughes					<point x="100" y="200" type="curve"/>
934*e1fe3e4aSElliott Hughes				</contour>
935*e1fe3e4aSElliott Hughes			</outline>
936*e1fe3e4aSElliott Hughes		</glyph>
937*e1fe3e4aSElliott Hughes		"""
938*e1fe3e4aSElliott Hughes        py = """
939*e1fe3e4aSElliott Hughes		glyph.name = "a"
940*e1fe3e4aSElliott Hughes		pointPen.beginPath()
941*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False})
942*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 100)], **{"smooth" : False})
943*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(35, 125)], **{"smooth" : False})
944*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(65, 200)], **{"smooth" : False})
945*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(100, 200)], **{"segmentType" : "curve", "smooth" : False})
946*e1fe3e4aSElliott Hughes		pointPen.endPath()
947*e1fe3e4aSElliott Hughes		"""
948*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.pyToGLIF, py)
949*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
950*e1fe3e4aSElliott Hughes
951*e1fe3e4aSElliott Hughes    def testPointQCurve_legal(self):
952*e1fe3e4aSElliott Hughes        # legal
953*e1fe3e4aSElliott Hughes        glif = """
954*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
955*e1fe3e4aSElliott Hughes			<outline>
956*e1fe3e4aSElliott Hughes				<contour>
957*e1fe3e4aSElliott Hughes					<point x="0" y="0" type="move"/>
958*e1fe3e4aSElliott Hughes					<point x="0" y="65"/>
959*e1fe3e4aSElliott Hughes					<point x="65" y="200"/>
960*e1fe3e4aSElliott Hughes					<point x="100" y="200" type="qcurve"/>
961*e1fe3e4aSElliott Hughes				</contour>
962*e1fe3e4aSElliott Hughes			</outline>
963*e1fe3e4aSElliott Hughes		</glyph>
964*e1fe3e4aSElliott Hughes		"""
965*e1fe3e4aSElliott Hughes        py = """
966*e1fe3e4aSElliott Hughes		glyph.name = "a"
967*e1fe3e4aSElliott Hughes		pointPen.beginPath()
968*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False})
969*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 65)], **{"smooth" : False})
970*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(65, 200)], **{"smooth" : False})
971*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(100, 200)], **{"segmentType" : "qcurve", "smooth" : False})
972*e1fe3e4aSElliott Hughes		pointPen.endPath()
973*e1fe3e4aSElliott Hughes		"""
974*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
975*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
976*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
977*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
978*e1fe3e4aSElliott Hughes
979*e1fe3e4aSElliott Hughes    def testPointQCurve_legal_start_of_contour(self):
980*e1fe3e4aSElliott Hughes        # legal: start of contour
981*e1fe3e4aSElliott Hughes        glif = """
982*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
983*e1fe3e4aSElliott Hughes			<outline>
984*e1fe3e4aSElliott Hughes				<contour>
985*e1fe3e4aSElliott Hughes					<point x="100" y="200" type="qcurve"/>
986*e1fe3e4aSElliott Hughes					<point x="0" y="65"/>
987*e1fe3e4aSElliott Hughes					<point x="65" y="200"/>
988*e1fe3e4aSElliott Hughes				</contour>
989*e1fe3e4aSElliott Hughes			</outline>
990*e1fe3e4aSElliott Hughes		</glyph>
991*e1fe3e4aSElliott Hughes		"""
992*e1fe3e4aSElliott Hughes        py = """
993*e1fe3e4aSElliott Hughes		glyph.name = "a"
994*e1fe3e4aSElliott Hughes		pointPen.beginPath()
995*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(100, 200)], **{"segmentType" : "qcurve", "smooth" : False})
996*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 65)], **{"smooth" : False})
997*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(65, 200)], **{"smooth" : False})
998*e1fe3e4aSElliott Hughes		pointPen.endPath()
999*e1fe3e4aSElliott Hughes		"""
1000*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
1001*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
1002*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
1003*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
1004*e1fe3e4aSElliott Hughes
1005*e1fe3e4aSElliott Hughes    def testPointQCurve_legal_smooth(self):
1006*e1fe3e4aSElliott Hughes        # legal: smooth=True
1007*e1fe3e4aSElliott Hughes        glif = """
1008*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
1009*e1fe3e4aSElliott Hughes			<outline>
1010*e1fe3e4aSElliott Hughes				<contour>
1011*e1fe3e4aSElliott Hughes					<point x="0" y="0" type="move"/>
1012*e1fe3e4aSElliott Hughes					<point x="0" y="65"/>
1013*e1fe3e4aSElliott Hughes					<point x="65" y="200"/>
1014*e1fe3e4aSElliott Hughes					<point x="100" y="200" type="qcurve" smooth="yes"/>
1015*e1fe3e4aSElliott Hughes				</contour>
1016*e1fe3e4aSElliott Hughes			</outline>
1017*e1fe3e4aSElliott Hughes		</glyph>
1018*e1fe3e4aSElliott Hughes		"""
1019*e1fe3e4aSElliott Hughes        py = """
1020*e1fe3e4aSElliott Hughes		glyph.name = "a"
1021*e1fe3e4aSElliott Hughes		pointPen.beginPath()
1022*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False})
1023*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 65)], **{"smooth" : False})
1024*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(65, 200)], **{"smooth" : False})
1025*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(100, 200)], **{"segmentType" : "qcurve", "smooth" : True})
1026*e1fe3e4aSElliott Hughes		pointPen.endPath()
1027*e1fe3e4aSElliott Hughes		"""
1028*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
1029*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
1030*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
1031*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
1032*e1fe3e4aSElliott Hughes
1033*e1fe3e4aSElliott Hughes    def testPointQCurve_legal_no_off_curves(self):
1034*e1fe3e4aSElliott Hughes        # legal: no off-curves
1035*e1fe3e4aSElliott Hughes        glif = """
1036*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
1037*e1fe3e4aSElliott Hughes			<outline>
1038*e1fe3e4aSElliott Hughes				<contour>
1039*e1fe3e4aSElliott Hughes					<point x="0" y="0" type="move"/>
1040*e1fe3e4aSElliott Hughes					<point x="100" y="200" type="qcurve"/>
1041*e1fe3e4aSElliott Hughes				</contour>
1042*e1fe3e4aSElliott Hughes			</outline>
1043*e1fe3e4aSElliott Hughes		</glyph>
1044*e1fe3e4aSElliott Hughes		"""
1045*e1fe3e4aSElliott Hughes        py = """
1046*e1fe3e4aSElliott Hughes		glyph.name = "a"
1047*e1fe3e4aSElliott Hughes		pointPen.beginPath()
1048*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False})
1049*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(100, 200)], **{"segmentType" : "qcurve", "smooth" : False})
1050*e1fe3e4aSElliott Hughes		pointPen.endPath()
1051*e1fe3e4aSElliott Hughes		"""
1052*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
1053*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
1054*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
1055*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
1056*e1fe3e4aSElliott Hughes
1057*e1fe3e4aSElliott Hughes    def testPointQCurve_legal_one_off_curve(self):
1058*e1fe3e4aSElliott Hughes        # legal: 1 off-curve
1059*e1fe3e4aSElliott Hughes        glif = """
1060*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
1061*e1fe3e4aSElliott Hughes			<outline>
1062*e1fe3e4aSElliott Hughes				<contour>
1063*e1fe3e4aSElliott Hughes					<point x="0" y="0" type="move"/>
1064*e1fe3e4aSElliott Hughes					<point x="50" y="100"/>
1065*e1fe3e4aSElliott Hughes					<point x="100" y="200" type="qcurve"/>
1066*e1fe3e4aSElliott Hughes				</contour>
1067*e1fe3e4aSElliott Hughes			</outline>
1068*e1fe3e4aSElliott Hughes		</glyph>
1069*e1fe3e4aSElliott Hughes		"""
1070*e1fe3e4aSElliott Hughes        py = """
1071*e1fe3e4aSElliott Hughes		glyph.name = "a"
1072*e1fe3e4aSElliott Hughes		pointPen.beginPath()
1073*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False})
1074*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(50, 100)], **{"smooth" : False})
1075*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(100, 200)], **{"segmentType" : "qcurve", "smooth" : False})
1076*e1fe3e4aSElliott Hughes		pointPen.endPath()
1077*e1fe3e4aSElliott Hughes		"""
1078*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
1079*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
1080*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
1081*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
1082*e1fe3e4aSElliott Hughes
1083*e1fe3e4aSElliott Hughes    def testPointQCurve_legal_3_off_curves(self):
1084*e1fe3e4aSElliott Hughes        # legal: 3 off-curves
1085*e1fe3e4aSElliott Hughes        glif = """
1086*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
1087*e1fe3e4aSElliott Hughes			<outline>
1088*e1fe3e4aSElliott Hughes				<contour>
1089*e1fe3e4aSElliott Hughes					<point x="0" y="0" type="move"/>
1090*e1fe3e4aSElliott Hughes					<point x="0" y="100"/>
1091*e1fe3e4aSElliott Hughes					<point x="35" y="125"/>
1092*e1fe3e4aSElliott Hughes					<point x="65" y="200"/>
1093*e1fe3e4aSElliott Hughes					<point x="100" y="200" type="qcurve"/>
1094*e1fe3e4aSElliott Hughes				</contour>
1095*e1fe3e4aSElliott Hughes			</outline>
1096*e1fe3e4aSElliott Hughes		</glyph>
1097*e1fe3e4aSElliott Hughes		"""
1098*e1fe3e4aSElliott Hughes        py = """
1099*e1fe3e4aSElliott Hughes		glyph.name = "a"
1100*e1fe3e4aSElliott Hughes		pointPen.beginPath()
1101*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False})
1102*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 100)], **{"smooth" : False})
1103*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(35, 125)], **{"smooth" : False})
1104*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(65, 200)], **{"smooth" : False})
1105*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(100, 200)], **{"segmentType" : "qcurve", "smooth" : False})
1106*e1fe3e4aSElliott Hughes		pointPen.endPath()
1107*e1fe3e4aSElliott Hughes		"""
1108*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
1109*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
1110*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
1111*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
1112*e1fe3e4aSElliott Hughes
1113*e1fe3e4aSElliott Hughes    def testSpecialCaseQCurve(self):
1114*e1fe3e4aSElliott Hughes        # contour with no on curve
1115*e1fe3e4aSElliott Hughes        glif = """
1116*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
1117*e1fe3e4aSElliott Hughes			<outline>
1118*e1fe3e4aSElliott Hughes				<contour>
1119*e1fe3e4aSElliott Hughes					<point x="0" y="0"/>
1120*e1fe3e4aSElliott Hughes					<point x="0" y="100"/>
1121*e1fe3e4aSElliott Hughes					<point x="100" y="100"/>
1122*e1fe3e4aSElliott Hughes					<point x="100" y="0"/>
1123*e1fe3e4aSElliott Hughes				</contour>
1124*e1fe3e4aSElliott Hughes			</outline>
1125*e1fe3e4aSElliott Hughes		</glyph>
1126*e1fe3e4aSElliott Hughes		"""
1127*e1fe3e4aSElliott Hughes        py = """
1128*e1fe3e4aSElliott Hughes		glyph.name = "a"
1129*e1fe3e4aSElliott Hughes		pointPen.beginPath()
1130*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 0)], **{"smooth" : False})
1131*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 100)], **{"smooth" : False})
1132*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(100, 100)], **{"smooth" : False})
1133*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(100, 0)], **{"smooth" : False})
1134*e1fe3e4aSElliott Hughes		pointPen.endPath()
1135*e1fe3e4aSElliott Hughes		"""
1136*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
1137*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
1138*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
1139*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
1140*e1fe3e4aSElliott Hughes
1141*e1fe3e4aSElliott Hughes    def testPointTypeOffCurve_legal(self):
1142*e1fe3e4aSElliott Hughes        # legal
1143*e1fe3e4aSElliott Hughes        glif = """
1144*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
1145*e1fe3e4aSElliott Hughes			<outline>
1146*e1fe3e4aSElliott Hughes				<contour>
1147*e1fe3e4aSElliott Hughes					<point x="0" y="0" type="move"/>
1148*e1fe3e4aSElliott Hughes					<point x="0" y="65"/>
1149*e1fe3e4aSElliott Hughes					<point x="65" y="200"/>
1150*e1fe3e4aSElliott Hughes					<point x="100" y="200" type="curve"/>
1151*e1fe3e4aSElliott Hughes				</contour>
1152*e1fe3e4aSElliott Hughes			</outline>
1153*e1fe3e4aSElliott Hughes		</glyph>
1154*e1fe3e4aSElliott Hughes		"""
1155*e1fe3e4aSElliott Hughes        py = """
1156*e1fe3e4aSElliott Hughes		glyph.name = "a"
1157*e1fe3e4aSElliott Hughes		pointPen.beginPath()
1158*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False})
1159*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 65)], **{"smooth" : False})
1160*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(65, 200)], **{"smooth" : False})
1161*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(100, 200)], **{"segmentType" : "curve", "smooth" : False})
1162*e1fe3e4aSElliott Hughes		pointPen.endPath()
1163*e1fe3e4aSElliott Hughes		"""
1164*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
1165*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
1166*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
1167*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
1168*e1fe3e4aSElliott Hughes
1169*e1fe3e4aSElliott Hughes    def testPointTypeOffCurve_legal_start_of_contour(self):
1170*e1fe3e4aSElliott Hughes        # legal: start of contour
1171*e1fe3e4aSElliott Hughes        glif = """
1172*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
1173*e1fe3e4aSElliott Hughes			<outline>
1174*e1fe3e4aSElliott Hughes				<contour>
1175*e1fe3e4aSElliott Hughes					<point x="0" y="65"/>
1176*e1fe3e4aSElliott Hughes					<point x="65" y="200"/>
1177*e1fe3e4aSElliott Hughes					<point x="100" y="200" type="curve"/>
1178*e1fe3e4aSElliott Hughes				</contour>
1179*e1fe3e4aSElliott Hughes			</outline>
1180*e1fe3e4aSElliott Hughes		</glyph>
1181*e1fe3e4aSElliott Hughes		"""
1182*e1fe3e4aSElliott Hughes        py = """
1183*e1fe3e4aSElliott Hughes		glyph.name = "a"
1184*e1fe3e4aSElliott Hughes		pointPen.beginPath()
1185*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 65)], **{"smooth" : False})
1186*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(65, 200)], **{"smooth" : False})
1187*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(100, 200)], **{"segmentType" : "curve", "smooth" : False})
1188*e1fe3e4aSElliott Hughes		pointPen.endPath()
1189*e1fe3e4aSElliott Hughes		"""
1190*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
1191*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
1192*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
1193*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
1194*e1fe3e4aSElliott Hughes
1195*e1fe3e4aSElliott Hughes    def testPointTypeOffCurve_illegal_before_move(self):
1196*e1fe3e4aSElliott Hughes        # before move
1197*e1fe3e4aSElliott Hughes        glif = """
1198*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
1199*e1fe3e4aSElliott Hughes			<outline>
1200*e1fe3e4aSElliott Hughes				<contour>
1201*e1fe3e4aSElliott Hughes					<point x="0" y="65"/>
1202*e1fe3e4aSElliott Hughes					<point x="0" y="0" type="move"/>
1203*e1fe3e4aSElliott Hughes				</contour>
1204*e1fe3e4aSElliott Hughes			</outline>
1205*e1fe3e4aSElliott Hughes		</glyph>
1206*e1fe3e4aSElliott Hughes		"""
1207*e1fe3e4aSElliott Hughes        py = """
1208*e1fe3e4aSElliott Hughes		glyph.name = "a"
1209*e1fe3e4aSElliott Hughes		pointPen.beginPath()
1210*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 65)], **{"smooth" : False})
1211*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 0)], **{"segmentType" : "move", "smooth" : False})
1212*e1fe3e4aSElliott Hughes		pointPen.endPath()
1213*e1fe3e4aSElliott Hughes		"""
1214*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.pyToGLIF, py)
1215*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
1216*e1fe3e4aSElliott Hughes
1217*e1fe3e4aSElliott Hughes    def testPointTypeOffCurve_illegal_before_line(self):
1218*e1fe3e4aSElliott Hughes        # before line
1219*e1fe3e4aSElliott Hughes        glif = """
1220*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
1221*e1fe3e4aSElliott Hughes			<outline>
1222*e1fe3e4aSElliott Hughes				<contour>
1223*e1fe3e4aSElliott Hughes					<point x="0" y="65"/>
1224*e1fe3e4aSElliott Hughes					<point x="0" y="0" type="line"/>
1225*e1fe3e4aSElliott Hughes				</contour>
1226*e1fe3e4aSElliott Hughes			</outline>
1227*e1fe3e4aSElliott Hughes		</glyph>
1228*e1fe3e4aSElliott Hughes		"""
1229*e1fe3e4aSElliott Hughes        py = """
1230*e1fe3e4aSElliott Hughes		glyph.name = "a"
1231*e1fe3e4aSElliott Hughes		pointPen.beginPath()
1232*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 65)], **{"smooth" : False})
1233*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 0)], **{"segmentType" : "line", "smooth" : False})
1234*e1fe3e4aSElliott Hughes		pointPen.endPath()
1235*e1fe3e4aSElliott Hughes		"""
1236*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.pyToGLIF, py)
1237*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
1238*e1fe3e4aSElliott Hughes
1239*e1fe3e4aSElliott Hughes    def testPointTypeOffCurve_illegal_smooth(self):
1240*e1fe3e4aSElliott Hughes        # smooth=True
1241*e1fe3e4aSElliott Hughes        glif = """
1242*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
1243*e1fe3e4aSElliott Hughes			<outline>
1244*e1fe3e4aSElliott Hughes				<contour>
1245*e1fe3e4aSElliott Hughes					<point x="0" y="65" smooth="yes"/>
1246*e1fe3e4aSElliott Hughes					<point x="0" y="0" type="curve"/>
1247*e1fe3e4aSElliott Hughes				</contour>
1248*e1fe3e4aSElliott Hughes			</outline>
1249*e1fe3e4aSElliott Hughes		</glyph>
1250*e1fe3e4aSElliott Hughes		"""
1251*e1fe3e4aSElliott Hughes        py = """
1252*e1fe3e4aSElliott Hughes		glyph.name = "a"
1253*e1fe3e4aSElliott Hughes		pointPen.beginPath()
1254*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 65)], **{"smooth" : True})
1255*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(0, 0)], **{"segmentType" : "curve", "smooth" : False})
1256*e1fe3e4aSElliott Hughes		pointPen.endPath()
1257*e1fe3e4aSElliott Hughes		"""
1258*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.pyToGLIF, py)
1259*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.glifToPy, glif)
1260*e1fe3e4aSElliott Hughes
1261*e1fe3e4aSElliott Hughes    def testSinglePoint_legal_without_name(self):
1262*e1fe3e4aSElliott Hughes        # legal
1263*e1fe3e4aSElliott Hughes        # glif format 1 single point without a name was not an anchor
1264*e1fe3e4aSElliott Hughes        glif = """
1265*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
1266*e1fe3e4aSElliott Hughes			<outline>
1267*e1fe3e4aSElliott Hughes				<contour>
1268*e1fe3e4aSElliott Hughes					<point x="1" y="2" type="move"/>
1269*e1fe3e4aSElliott Hughes				</contour>
1270*e1fe3e4aSElliott Hughes			</outline>
1271*e1fe3e4aSElliott Hughes		</glyph>
1272*e1fe3e4aSElliott Hughes		"""
1273*e1fe3e4aSElliott Hughes        py = """
1274*e1fe3e4aSElliott Hughes		glyph.name = "a"
1275*e1fe3e4aSElliott Hughes		pointPen.beginPath()
1276*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1, 2)], **{"segmentType" : "move", "smooth" : False})
1277*e1fe3e4aSElliott Hughes		pointPen.endPath()
1278*e1fe3e4aSElliott Hughes		"""
1279*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
1280*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
1281*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
1282*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
1283*e1fe3e4aSElliott Hughes
1284*e1fe3e4aSElliott Hughes    def testAnchor_legal_with_name(self):
1285*e1fe3e4aSElliott Hughes        glif = """
1286*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
1287*e1fe3e4aSElliott Hughes			<outline>
1288*e1fe3e4aSElliott Hughes				<contour>
1289*e1fe3e4aSElliott Hughes					<point x="1" y="2" type="move" name="test"/>
1290*e1fe3e4aSElliott Hughes				</contour>
1291*e1fe3e4aSElliott Hughes			</outline>
1292*e1fe3e4aSElliott Hughes		</glyph>
1293*e1fe3e4aSElliott Hughes		"""
1294*e1fe3e4aSElliott Hughes        py = """
1295*e1fe3e4aSElliott Hughes		glyph.name = "a"
1296*e1fe3e4aSElliott Hughes		glyph.anchors = [{"name" : "test", "x" : 1, "y" : 2}]
1297*e1fe3e4aSElliott Hughes		"""
1298*e1fe3e4aSElliott Hughes        resultGlif = self.pyToGLIF(py)
1299*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
1300*e1fe3e4aSElliott Hughes        self.assertEqual(glif, resultGlif)
1301*e1fe3e4aSElliott Hughes        self.assertEqual(py, resultPy)
1302*e1fe3e4aSElliott Hughes
1303*e1fe3e4aSElliott Hughes    def testOpenContourLooseOffCurves_legal(self):
1304*e1fe3e4aSElliott Hughes        # a piece of software was writing this kind of structure
1305*e1fe3e4aSElliott Hughes        glif = """
1306*e1fe3e4aSElliott Hughes		<glyph name="a" format="1">
1307*e1fe3e4aSElliott Hughes			<outline>
1308*e1fe3e4aSElliott Hughes				<contour>
1309*e1fe3e4aSElliott Hughes					<point x="1" y="2" type="move"/>
1310*e1fe3e4aSElliott Hughes					<point x="1" y="2"/>
1311*e1fe3e4aSElliott Hughes					<point x="1" y="2"/>
1312*e1fe3e4aSElliott Hughes					<point x="1" y="2" type="curve"/>
1313*e1fe3e4aSElliott Hughes					<point x="1" y="2"/>
1314*e1fe3e4aSElliott Hughes				</contour>
1315*e1fe3e4aSElliott Hughes			</outline>
1316*e1fe3e4aSElliott Hughes		</glyph>
1317*e1fe3e4aSElliott Hughes		"""
1318*e1fe3e4aSElliott Hughes        expectedPy = """
1319*e1fe3e4aSElliott Hughes		glyph.name = "a"
1320*e1fe3e4aSElliott Hughes		pointPen.beginPath()
1321*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1, 2)], **{"segmentType" : "move", "smooth" : False})
1322*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1, 2)], **{"smooth" : False})
1323*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1, 2)], **{"smooth" : False})
1324*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1, 2)], **{"segmentType" : "curve", "smooth" : False})
1325*e1fe3e4aSElliott Hughes		pointPen.endPath()
1326*e1fe3e4aSElliott Hughes		"""
1327*e1fe3e4aSElliott Hughes        resultPy = self.glifToPy(glif)
1328*e1fe3e4aSElliott Hughes        self.assertEqual(resultPy, expectedPy)
1329*e1fe3e4aSElliott Hughes
1330*e1fe3e4aSElliott Hughes    def testOpenContourLooseOffCurves_illegal(self):
1331*e1fe3e4aSElliott Hughes        py = """
1332*e1fe3e4aSElliott Hughes		glyph.name = "a"
1333*e1fe3e4aSElliott Hughes		pointPen.beginPath()
1334*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1, 2)], **{"segmentType" : "move", "smooth" : False})
1335*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1, 2)], **{"smooth" : False})
1336*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1, 2)], **{"smooth" : False})
1337*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1, 2)], **{"segmentType" : "curve", "smooth" : False})
1338*e1fe3e4aSElliott Hughes		pointPen.addPoint(*[(1, 2)], **{"smooth" : False})
1339*e1fe3e4aSElliott Hughes		pointPen.endPath()
1340*e1fe3e4aSElliott Hughes		"""
1341*e1fe3e4aSElliott Hughes        self.assertRaises(GlifLibError, self.pyToGLIF, py)
1342