class CopyLineParser(LineParser):
	def __init__(self):
		LineParser.__init__(self)
		self.__copyArguments = CopyArguments()

	def parseLine(self, line):
		assert line is not None

		srcFileNameRegexp = r"'(?P<src>[^']+)'"
		dstFileNameRegexp = r"'(?P<dst>[^']+)'$"

		rb = RegexpBuilder()
		regexpSource = rb.startsWith('copy') + srcFileNameRegexp + rb.keywordToken('to') + dstFileNameRegexp
		regexp = re.compile(regexpSource, re.UNICODE)

		match = regexp.match(line)
		self._guardMatch(match, line, regexpSource)

		src = match.group('src')
		dst = match.group('dst')

		self.__copyArguments.setArguments(src, dst)
		return self.__copyArguments

	def isValidLine(self, line):
		assert line is not None

		isValid = line.startswith("copy")
		return isValid
	def getCommandFor(self, line):
		assert line is not None

		parser = InstallProfileParser()

		srcPath = parser.parseLine(line)
		dstPath = self.getDestinationPath(srcPath)

		cpArgs = CopyArguments()
		cpArgs.setArguments(srcPath, dstPath)

		command = CopyCommand(cpArgs)
		return command
class TestCopyArguments(unittest.TestCase):
	def setUp(self):
		self.__copyArguments = CopyArguments()

	def test_isValid(self):
		self.__copyArguments.setArguments("someVal1", "someVal2")
		isValid = self.__copyArguments.isValid()

		self.assertEqual(True, isValid)

	def test_notValid(self):
		self.__copyArguments.setArguments(None, "someVal2")
		isValid = self.__copyArguments.isValid()

		self.assertEqual(False, isValid)

	def test_safeValues(self):
		self.__copyArguments.setArguments('val1', 'val2')

		safeSrc = self.__copyArguments.getSafeSource()
		safeDst = self.__copyArguments.getSaveTarget()

		self.assertEqual('val1', safeSrc)
		self.assertEqual('val2', safeDst)

	def test_unsafeValues(self):
		self.__copyArguments.setArguments('val1 with ws', 'val2 with ws')

		safeSrc = self.__copyArguments.getSafeSource()
		safeDst = self.__copyArguments.getSaveTarget()

		self.assertEqual('"val1 with ws"', safeSrc)
		self.assertEqual('"val2 with ws"', safeDst)