import unittest

import ucdresolve
from ucdresolve import corpus
from ucdresolve import ucdmodel
from ucdresolve import ucds

rawTestCorpus = """
SRS                 |      1175|    1|   22|SRS (catalog <I/138>) number                                                                                                                                                                                                                                   |	meta.id
Plx                 |      1239|    2|   22|Trigonometric parallax (DC17)                                                                                                                                                                                                                                  |	pos.parallax.trig
period              |      1239|    4|   18|? Period from literature (P18)                                                                                                                                                                                                                                 |	time.period
DpmRA*sys           |      1264|    1|   77|FK5-HIP difference in pm_RA*cos(DE) (9)                                                                                                                                                                                                                        |	stat.fit.residual
Note                |      1264|    2|   52|? Number of the note in file notes3.dat                                                                                                                                                                                                                        |	meta.note
EpDE                |      1276|    1|    8|Epoch of declination                                                                                                                                                                                                                                           |	time.epoch
Tycho-2             |      1294|    1|   36|Display the Tycho-2 data (H\o g et al., Cat. I/259)                                                                                                                                                                                                            |	meta.ref
e                   |      1305|    1|   31|? Eccentricity of fitting ellipse                                                                                                                                                                                                                              |	src.orbital.eccentricity
_DE                 |      2037|    1|   12|Position from Simbad (declination part)                                                                                                                                                                                                                        |	pos.eq.dec;meta.main
recno               |      2047|    1|    0|Record number within the original table (starting from 1)                                                                                                                                                                                                      |	meta.record
""".strip().split("\n")

class TestSmoothing(unittest.TestCase):
	"""Tests for smoothing in TokDistros.
	"""
	def setUp(self):
		self.testCorpus = corpus.FeedableCorpus.fromSource(rawTestCorpus,
			ucdFactory=ucdmodel.UCD.fromVizierLine)
		self.td = corpus.TokDistros(self.testCorpus)

	def testURestsPositive(self):
		"""tests that estimated ucd marginals are always smaller than real 
		ucd marginals.
		"""
		for u in self.td.restMarginU:
			self.failUnless(self.td.restMarginU[u]>0,
				"Margin rest not positive for %s"%repr(u))

	def testSmallerTMarginals(self):
		"""tests that estimated token marginals are always smaller than real 
		token marginals.
		"""
		for t in self.td.restMarginT:
			self.failUnless(self.td.restMarginT[t]>0,
				"Margin rest not positive for %s"%repr(t))

	def testMarginalSums(self):
		self.assertAlmostEqual(self.td.uSum, self.td.tSum, 6)

	def testContingencyWithUnknowns(self):
		pass


class TestResolution(unittest.TestCase):
	"""Tests for actual resolution of descriptions.
	"""
	def setUp(self):
		self.testCorpus = corpus.CollocWeightingCorpus.fromSource(rawTestCorpus,
			ucdFactory=ucdmodel.UCD.fromVizierLine)

	def testSimpleResolution(self):
		desc = ucdmodel.UCD.fromDescription("catalog number")
		self.assertEqual(self.testCorpus.resolve(desc)[0][1], "meta.id")
		desc = ucdmodel.UCD.fromDescription("parallax")
		self.assertEqual(self.testCorpus.resolve(desc)[0][1], "pos.parallax.trig")


def singleTest():
	suite = unittest.makeSuite(TestReal, "test")
	runner = unittest.TextTestRunner()
	runner.run(suite)

if __name__=="__main__":
#	unittest.main()
	singleTest()
