import unittest

import FixPath
from MiscUtils.CSVParser import CSVParser, ParseError


class CSVParserTests(unittest.TestCase):
	"""CSV parser tests.

	TO DO

	* Test the different options for parser, see CVSParser.__init__().

	"""

	def setUp(self):
		self.parse = CSVParser().parse

	def testNegatives(self):
		inputs = [
			'""a',
			'"a"b',
			'a\n,b'
		]
		for input in inputs:
			try:
				results = self.parse(input)
			except ParseError:
				pass
			else:
				print
				print 'results:', repr(results)
				raise Exception, 'Did not get an exception for: %r' % input

	def testPositives(self):
		tests = [
			# basics
			('', []),
			(',', ['', '']),
			(',,', ['', '', '']),
			('a', ['a']),
			('a,b', ['a', 'b']),
			('a,b,c,d,e,f', 'a b c d e f'.split()),

			# surrounding whitespace
			(' a', ['a']),
			('a ', ['a']),
			(' a ', ['a']),
			('a, b', ['a', 'b']),
			('  a  ,  b  ', ['a', 'b']),

			# commas in fields
			('","', [',']),
			('",",","', [',', ',']),
			('"a  ,  b",b', ['a  ,  b', 'b']),

			# quotes in fields
			('""""', ['"']),
			('""""""', ['""']),
			('"""a""",b,"""c"""', ['"a"', 'b', '"c"']),

			# single line combos
			(' "a", "b"', ['a', 'b']),
			('  """"', ['"']),
			('""""  ', ['"']),
			('  """"  ', ['"']),
			(' """a""",  """b"""', ['"a"', '"b"']),
			('  """",  ",",   ""","""', ['"', ',', '","']),

			# comments
			('#a,b', []),

			# multiple line records
			('"a\nb"', ['a\nb']),
			('a,"b\nc"', ['a', 'b\nc']),
			('a,"b\nc\n\n\n"', ['a', 'b\nc']),

			# MiddleKit enums
			('a,Enums="b"', ['a', 'Enums="b"']),
			("a,Enums='b'", ['a', "Enums='b'"]),
			('a,"Enums=""b, c"""', ['a', 'Enums="b, c"']),
			('''a,"Enums='b, c'"''', ['a', "Enums='b, c'"]),
		]
		for input, output in tests:
			if input.find('\n') == -1:
				# single line
				result = self.parse(input)
				assert result == output, '\ninput=%r\nresult=%r\noutput=%r'\
					% (input, result, output)
				result = self.parse(input+'\n')
				assert result == output, '\ninput=%r\nresult=%r\noutput=%r' \
					% (input, result, output)
			else:
				# multiple lines
				gotFields = 0
				for line in input.split('\n'):
					assert not gotFields
					result = self.parse(line)
					if result is not None:
						gotFields = 1
				assert gotFields
				assert result == output, '\ninput=%r\nresult=%r\noutput=%r' \
					% (input, result, output)


def main():
	suite = unittest.makeSuite(CSVParserTests, 'test')
	runner = unittest.TextTestRunner()
	runner.run(suite)


if __name__ == '__main__':
	main()
