from __future__ import unicode_literals
import unittest
from fontTools.misc.filenames import (
	userNameToFileName, handleClash1, handleClash2)


class UserNameToFilenameTest(unittest.TestCase):

	def test_names(self):
		self.assertEqual(userNameToFileName("a"),"a")
		self.assertEqual(userNameToFileName("A"), "A_")
		self.assertEqual(userNameToFileName("AE"), "A_E_")
		self.assertEqual(userNameToFileName("Ae"), "A_e")
		self.assertEqual(userNameToFileName("ae"), "ae")
		self.assertEqual(userNameToFileName("aE"), "aE_")
		self.assertEqual(userNameToFileName("a.alt"), "a.alt")
		self.assertEqual(userNameToFileName("A.alt"), "A_.alt")
		self.assertEqual(userNameToFileName("A.Alt"), "A_.A_lt")
		self.assertEqual(userNameToFileName("A.aLt"), "A_.aL_t")
		self.assertEqual(userNameToFileName(u"A.alT"), "A_.alT_")
		self.assertEqual(userNameToFileName("T_H"), "T__H_")
		self.assertEqual(userNameToFileName("T_h"), "T__h")
		self.assertEqual(userNameToFileName("t_h"), "t_h")
		self.assertEqual(userNameToFileName("F_F_I"), "F__F__I_")
		self.assertEqual(userNameToFileName("f_f_i"), "f_f_i")
		self.assertEqual(
			userNameToFileName("Aacute_V.swash"),
			"A_acute_V_.swash")
		self.assertEqual(userNameToFileName(".notdef"), "_notdef")
		self.assertEqual(userNameToFileName("con"), "_con")
		self.assertEqual(userNameToFileName("CON"), "C_O_N_")
		self.assertEqual(userNameToFileName("con.alt"), "_con.alt")
		self.assertEqual(userNameToFileName("alt.con"), "alt._con")

	def test_prefix_suffix(self):
		prefix = "TEST_PREFIX"
		suffix = "TEST_SUFFIX"
		name = "NAME"
		name_file = "N_A_M_E_"
		self.assertEqual(
			userNameToFileName(name, prefix=prefix, suffix=suffix),
			prefix + name_file + suffix)

	def test_collide(self):
		prefix = "TEST_PREFIX"
		suffix = "TEST_SUFFIX"
		name = "NAME"
		name_file = "N_A_M_E_"
		collision_avoidance1 = "000000000000001"
		collision_avoidance2 = "000000000000002"
		exist = set()
		generated = userNameToFileName(
			name, exist, prefix=prefix, suffix=suffix)
		exist.add(generated.lower())
		self.assertEqual(generated, prefix + name_file + suffix)
		generated = userNameToFileName(
			name, exist, prefix=prefix, suffix=suffix)
		exist.add(generated.lower())
		self.assertEqual(
			generated,
			prefix + name_file + collision_avoidance1 + suffix)
		generated = userNameToFileName(
			name, exist, prefix=prefix, suffix=suffix)
		self.assertEqual(
			generated,
			prefix + name_file + collision_avoidance2+ suffix)

	def test_ValueError(self):
		with self.assertRaises(ValueError):
			userNameToFileName(b"a")
		with self.assertRaises(ValueError):
			userNameToFileName({"a"})
		with self.assertRaises(ValueError):
			userNameToFileName(("a",))
		with self.assertRaises(ValueError):
			userNameToFileName(["a"])
		with self.assertRaises(ValueError):
			userNameToFileName(["a"])
		with self.assertRaises(ValueError):
			userNameToFileName(b"\xd8\x00")

	def test_handleClash1(self):
		prefix = ("0" * 5) + "."
		suffix = "." + ("0" * 10)
		existing = ["a" * 5]

		e = list(existing)
		self.assertEqual(
			handleClash1(userName="A" * 5, existing=e, prefix=prefix,
						 suffix=suffix),
			'00000.AAAAA000000000000001.0000000000'
		)

		e = list(existing)
		e.append(prefix + "aaaaa" + "1".zfill(15) + suffix)
		self.assertEqual(
		handleClash1(userName="A" * 5, existing=e, prefix=prefix,
					 suffix=suffix),
		'00000.AAAAA000000000000002.0000000000'
		)

		e = list(existing)
		e.append(prefix + "AAAAA" + "2".zfill(15) + suffix)
		self.assertEqual(
			handleClash1(userName="A" * 5, existing=e, prefix=prefix,
						 suffix=suffix),
			'00000.AAAAA000000000000001.0000000000'
		)

	def test_handleClash2(self):
		prefix = ("0" * 5) + "."
		suffix = "." + ("0" * 10)
		existing = [prefix + str(i) + suffix for i in range(100)]

		e = list(existing)
		self.assertEqual(
			handleClash2(existing=e, prefix=prefix, suffix=suffix),
			'00000.100.0000000000'
		)

		e = list(existing)
		e.remove(prefix + "1" + suffix)
		self.assertEqual(
			handleClash2(existing=e, prefix=prefix, suffix=suffix),
			'00000.1.0000000000'
		)

		e = list(existing)
		e.remove(prefix + "2" + suffix)
		self.assertEqual(
			handleClash2(existing=e, prefix=prefix, suffix=suffix),
			'00000.2.0000000000'
		)

if __name__ == "__main__":
	import sys
	sys.exit(unittest.main())
