# -*- coding: utf-8 -*-
import aligner
import unittest

class TestAnchorWordHit(unittest.TestCase):
	def setUp(self):
		self.anchorWordHit = aligner.AnchorWordHit(1, 56, 2, 'julaften')

	def testGetIndex(self):
		self.assertEqual(self.anchorWordHit.getIndex(), 1)

	def testGetWord(self):
		self.assertEqual(self.anchorWordHit.getWord(), 'julaften')

	def testPos(self):
		self.assertEqual(self.anchorWordHit.getPos(), 2)
		self.assertEqual(self.anchorWordHit.setPos(80), self.anchorWordHit.getPos())

	def testGetElementNumber(self):
		self.assertEqual(self.anchorWordHit.getElementNumber(), 56)

class TestAnchorWordListEntry(unittest.TestCase):
	def setUp(self):
		self.alignerEntry = aligner.AnchorWordListEntry('de, dere, De, Dem, Dykk / doai, dii ')
		
	def testEntry(self):
		"""Check that an entry is correct"""
		self.assertEqual(self.alignerEntry.getEntry(), [['de', 'dere', 'De', 'Dem', 'Dykk'], ['doai', 'dii']])
	
class TestAnchorWordList(unittest.TestCase):
	def setUp(self):
		self.anchorList = aligner.AnchorWordList()
		self.anchorList.loadFromFile('anchor-nor-sme.txt')

	def testSize(self):
		"""Check that we have read the correct number of entries"""
		self.assertEqual(self.anchorList.getSize(), 1097)

	

class TestAlignmentElement(unittest.TestCase):
	def setUp(self):
		self.alignmentElement = aligner.AlignmentElement('Julenissen kommer hver julaften', 1, 2)

	def testGetText(self):
		self.assertEqual(self.alignmentElement.getText(), 'Julenissen kommer hver julaften')

	def testGetId(self):
		self.assertEqual(self.alignmentElement.getId(), 1)

	def testGetElementNumber(self):
		self.assertEqual(self.alignmentElement.getElementNumber(), 2)

	def testAlignmentNumber(self):
		self.assertEqual(self.alignmentElement.getAlignmentNumber(), -1)
		self.alignmentElement.setAlignmentNumber(4)
		self.assertEqual(self.alignmentElement.getAlignmentNumber(), 4)

class TestSentenceHandler(unittest.TestCase):
	def setUp(self):
		self.sentences = aligner.SentenceHandler('1999_1.doc.sent.xml')

	def testSize(self):
		self.assertEqual(self.sentences.getLength(), 4091)

	def testSentenceGetter(self):
		self.assertEqual(self.sentences.getSentence(401), 'Ragnhild Nystad ')

	def testFilenameGetter(self):
		self.assertEqual(self.sentences.getFilename(), '1999_1.doc.sent.xml')

class TestAlignerHandler(unittest.TestCase):
	def setUp(self):
		self.aligner = aligner.AlignerHandler('anchor-nor-sme.txt', ['1999_1.doc.sent.xml','1999_1s.doc.sent.xml'])

	def testAlign(self):
		self.assertEqual(self.aligner.align(), '0')

class TestBastPathScore(unittest.TestCase):
	def testDefaultValue(self):
		bps = aligner.BestPathScore()
		self.assertEqual(bps.getScore(), -1.0)

	def testSetValue(self):
		bps = aligner.BestPathScore(-0.5)
		self.assertEqual(bps.getScore(), -0.5)

class TestAnchorWordHit(unittest.TestCase):
	def setUp(self):
		self.awh = aligner.AnchorWordHit(2, 4, 6, 'juste')

	def testGetIndex(self):
		self.assertEqual(self.awh.getIndex(), 2)

	def testGetWord(self):
		self.assertEqual(self.awh.getWord(), 'juste')

	def testGetPost(self):
		self.assertEqual(self.awh.getPos(), 6)

	def testGetElementNumber(self):
		self.assertEqual(self.awh.getElementNumber(), 4)

	def testSetPos(self):
		self.awh.setPos(8)
		self.assertEqual(self.awh.getPos(), 8)

class TestScores(unittest.TestCase):
	def testDiceMatch(self):
		self.assertEqual(aligner.diceMatch('bargat', 'bargagoahtit'), 0.5)
		self.assertEqual(aligner.diceMatch('čoallagoađán', 'bargagoahtit'), 0.25)
	
	def testDiceMatches(self):
		self.assertEqual(aligner.diceMatches('bargat', 'bargagoahtit', 'čoallagoađán', '1-2'), [0.5, 0.0])
		self.assertEqual(aligner.diceMatches('bargat', 'bargagoahtit', 'čoallagoađán', '2-1'), [0.0, 0.25])
		self.assertEqual(aligner.diceMatches('bargat', 'bargagoahtit'), [0.5])

	def testAnchorMatch(self):
		self.assertEqual(aligner.anchorMatch('Afr*', 'Afrika'), True)
		self.assertEqual(aligner.anchorMatch('Afr*', 'Bengal'), False)

	def testBadLengthCorrelation(self):
		self.assertEqual(aligner.badLengthCorrelation(50, 20, 3, 7, 10), True)
		self.assertEqual(aligner.badLengthCorrelation(20, 50, 3, 7, 2), False)

class TestElementInfo(unittest.TestCase):
	def setUp(self):
		al = aligner.AnchorWordList('anchor-nor-sme.txt')
		self.ei = aligner.ElementInfo(al, 'Julenissen kommer med julegaver hvert år', 1, 74)

	def testElementInfo(self):
		self.assertEqual(self.ei.getLength(), 41)
		self.assertEqual(self.ei.getWords(), 'Julenissen kommer med julegaver hvert år')

class TestCompareMatrix(unittest.TestCase):
	def setUp(self):
		self.compareMatrix = aligner.CompareMatrix()
		self.compareMatrix.setScore([3, 4, 5, 6], 5.1)

	def testScore(self):
		self.assertEqual(self.compareMatrix.getScore([3, 4, 5, 6]), 5.1)

class TestPathStep(unittest.TestCase):
	def testPathStep(self):
		ps = aligner.PathStep([1,1])
		self.assertEqual(ps.is11(), True)
		ps = aligner.PathStep([1,0])
		self.assertEqual(ps.is11(), False)
		ps = aligner.PathStep([0,1])
		self.assertEqual(ps.is11(), False)
		ps = aligner.PathStep([1,2])
		self.assertEqual(ps.is11(), False)

class TestPath(unittest.TestCase):
	def testPath(self):
		path = aligner.Path([3,4])
		self.assertEqual(path.position, [3,4])
		ps1 = aligner.PathStep([1,1])
		ps2 = aligner.PathStep([0,0])
		path.extend(ps1)
		self.assertEqual(path.getSteps(), [ps1])
		path.extend(ps2)
		self.assertEqual(path.getSteps(), [ps1, ps2])
		path.setSteps([ps1, ps2])
		self.assertEqual(path.getSteps(), [ps1, ps2])
		self.assertEqual(path.getLengthInSentences(), 2)

class TestQueueEntry(unittest.TestCase):
	def setUp(self):
		self.qe = aligner.QueueEntry([1,0], 5.1)

	def testGetPath(self):
		path = aligner.Path([3,4])
		self.qe.setPath(path)
		self.assertEqual(self.qe.getPath(), path)
	
	def testRemoveEnd(self):
		self.assertEqual(self.qe.removed, False)
		self.assertEqual(self.qe.ended, False)
		self.qe.setRemoved()
		self.qe.setEnd()
		self.assertEqual(self.qe.getRemoved(), True)
		self.assertEqual(self.qe.getEnd(), True)

class TestCompare(unittest.TestCase):
	def setUp(self):
		self.c = aligner.Compare()

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