1import unittest 2from fontTools.ufoLib.filenames import userNameToFileName, handleClash1, handleClash2 3 4 5class TestFilenames(unittest.TestCase): 6 def test_userNameToFileName(self): 7 self.assertEqual(userNameToFileName("a"), "a") 8 self.assertEqual(userNameToFileName("A"), "A_") 9 self.assertEqual(userNameToFileName("AE"), "A_E_") 10 self.assertEqual(userNameToFileName("Ae"), "A_e") 11 self.assertEqual(userNameToFileName("ae"), "ae") 12 self.assertEqual(userNameToFileName("aE"), "aE_") 13 self.assertEqual(userNameToFileName("a.alt"), "a.alt") 14 self.assertEqual(userNameToFileName("A.alt"), "A_.alt") 15 self.assertEqual(userNameToFileName("A.Alt"), "A_.A_lt") 16 self.assertEqual(userNameToFileName("A.aLt"), "A_.aL_t") 17 self.assertEqual(userNameToFileName("A.alT"), "A_.alT_") 18 self.assertEqual(userNameToFileName("T_H"), "T__H_") 19 self.assertEqual(userNameToFileName("T_h"), "T__h") 20 self.assertEqual(userNameToFileName("t_h"), "t_h") 21 self.assertEqual(userNameToFileName("F_F_I"), "F__F__I_") 22 self.assertEqual(userNameToFileName("f_f_i"), "f_f_i") 23 self.assertEqual(userNameToFileName("Aacute_V.swash"), "A_acute_V_.swash") 24 self.assertEqual(userNameToFileName(".notdef"), "_notdef") 25 self.assertEqual(userNameToFileName("con"), "_con") 26 self.assertEqual(userNameToFileName("CON"), "C_O_N_") 27 self.assertEqual(userNameToFileName("con.alt"), "_con.alt") 28 self.assertEqual(userNameToFileName("alt.con"), "alt._con") 29 30 self.assertEqual( 31 # Test output for ASCII range (up until 0x7F), except for illegal 32 # characters. 33 userNameToFileName("".join([chr(i) for i in range(0, 0x80)])), 34 "________________________________" 35 " !_#$%&'____,-._0123456789_;_=__" 36 "@A_B_C_D_E_F_G_H_I_J_K_L_M_N_O_P_Q_R_S_T_U_V_W_X_Y_Z_" 37 "___^_`abcdefghijklmnopqrstuvwxyz{_}~_", 38 ) 39 40 def test_userNameToFileName_ValueError(self): 41 with self.assertRaises(ValueError): 42 userNameToFileName(b"a") 43 with self.assertRaises(ValueError): 44 userNameToFileName({"a"}) 45 with self.assertRaises(ValueError): 46 userNameToFileName(("a",)) 47 with self.assertRaises(ValueError): 48 userNameToFileName(["a"]) 49 with self.assertRaises(ValueError): 50 userNameToFileName(["a"]) 51 with self.assertRaises(ValueError): 52 userNameToFileName(b"\xd8\x00") 53 54 def test_handleClash1(self): 55 prefix = ("0" * 5) + "." 56 suffix = "." + ("0" * 10) 57 existing = ["a" * 5] 58 59 e = list(existing) 60 self.assertEqual( 61 handleClash1(userName="A" * 5, existing=e, prefix=prefix, suffix=suffix), 62 "00000.AAAAA000000000000001.0000000000", 63 ) 64 65 e = list(existing) 66 e.append(prefix + "aaaaa" + "1".zfill(15) + suffix) 67 self.assertEqual( 68 handleClash1(userName="A" * 5, existing=e, prefix=prefix, suffix=suffix), 69 "00000.AAAAA000000000000002.0000000000", 70 ) 71 72 e = list(existing) 73 e.append(prefix + "AAAAA" + "2".zfill(15) + suffix) 74 self.assertEqual( 75 handleClash1(userName="A" * 5, existing=e, prefix=prefix, suffix=suffix), 76 "00000.AAAAA000000000000001.0000000000", 77 ) 78 79 def test_handleClash2(self): 80 prefix = ("0" * 5) + "." 81 suffix = "." + ("0" * 10) 82 existing = [prefix + str(i) + suffix for i in range(100)] 83 84 e = list(existing) 85 self.assertEqual( 86 handleClash2(existing=e, prefix=prefix, suffix=suffix), 87 "00000.100.0000000000", 88 ) 89 90 e = list(existing) 91 e.remove(prefix + "1" + suffix) 92 self.assertEqual( 93 handleClash2(existing=e, prefix=prefix, suffix=suffix), "00000.1.0000000000" 94 ) 95 96 e = list(existing) 97 e.remove(prefix + "2" + suffix) 98 self.assertEqual( 99 handleClash2(existing=e, prefix=prefix, suffix=suffix), "00000.2.0000000000" 100 ) 101