from __future__ import print_function, division, absolute_import
from fontTools.misc.py23 import *
import sys
import os
import tempfile
import unittest
from fontTools.misc.textTools import deHexStr
from fontTools.misc.macRes import ResourceReader


# test resource data in DeRez notation
"""
data 'TEST' (128, "name1") { $"4865 6C6C 6F" };                   /* Hello */
data 'TEST' (129, "name2") { $"576F 726C 64" };                   /* World */
data 'test' (130, "name3") { $"486F 7720 6172 6520 796F 753F" };  /* How are you? */
"""
# the same data, compiled using Rez
# $ /usr/bin/Rez testdata.rez -o compiled
# $ hexdump -v compiled/..namedfork/rsrc
TEST_RSRC_FORK = deHexStr(
	"00 00 01 00 00 00 01 22 00 00 00 22 00 00 00 64 "  # 0x00000000
	"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x00000010
	"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x00000020
	"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x00000030
	"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x00000040
	"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x00000050
	"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x00000060
	"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x00000070
	"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x00000080
	"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x00000090
	"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x000000A0
	"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x000000B0
	"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x000000C0
	"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x000000D0
	"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x000000E0
	"00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x000000F0
	"00 00 00 05 48 65 6c 6c 6f 00 00 00 05 57 6f 72 "  # 0x00000100
	"6c 64 00 00 00 0c 48 6f 77 20 61 72 65 20 79 6f "  # 0x00000110
	"75 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "  # 0x00000120
	"00 00 00 00 00 00 00 00 00 00 00 1c 00 52 00 01 "  # 0x00000130
	"54 45 53 54 00 01 00 12 74 65 73 74 00 00 00 2a "  # 0x00000140
	"00 80 00 00 00 00 00 00 00 00 00 00 00 81 00 06 "  # 0x00000150
	"00 00 00 09 00 00 00 00 00 82 00 0c 00 00 00 12 "  # 0x00000160
	"00 00 00 00 05 6e 61 6d 65 31 05 6e 61 6d 65 32 "  # 0x00000170
	"05 6e 61 6d 65 33                               "  # 0x00000180
)


class ResourceReaderTest(unittest.TestCase):

	def test_read_file(self):
		infile = BytesIO(TEST_RSRC_FORK)
		reader = ResourceReader(infile)
		resources = [res for typ in reader.keys() for res in reader[typ]]
		self.assertExpected(resources)

	def test_read_datafork(self):
		with tempfile.NamedTemporaryFile(delete=False) as tmp:
			tmp.write(TEST_RSRC_FORK)
		try:
			reader = ResourceReader(tmp.name)
			resources = [res for typ in reader.keys() for res in reader[typ]]
			reader.close()
			self.assertExpected(resources)
		finally:
			os.remove(tmp.name)

	def test_read_namedfork_rsrc(self):
		if sys.platform != 'darwin':
			self.skipTest('Not supported on "%s"' % sys.platform)
		tmp = tempfile.NamedTemporaryFile(delete=False)
		tmp.close()
		try:
			with open(tmp.name + '/..namedfork/rsrc', 'wb') as fork:
				fork.write(TEST_RSRC_FORK)
			reader = ResourceReader(tmp.name)
			resources = [res for typ in reader.keys() for res in reader[typ]]
			reader.close()
			self.assertExpected(resources)
		finally:
			os.remove(tmp.name)

	def assertExpected(self, resources):
		self.assertRezEqual(resources[0], 'TEST', b'Hello', 128, 'name1')
		self.assertRezEqual(resources[1], 'TEST', b'World', 129, 'name2')
		self.assertRezEqual(
			resources[2], 'test', b'How are you?', 130, 'name3')

	def assertRezEqual(self, res, type_, data, id, name):
		self.assertEqual(res.type, type_)
		self.assertEqual(res.data, data)
		self.assertEqual(res.id, id)
		self.assertEqual(res.name, name)


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