"""
Tests for rule-based generation of compound UCDs.
"""

import unittest

from ucdresolve import rulebased


class ContextTest(unittest.TestCase):
	"""tests for simple operation of rulebased Contexts.
	"""
	def testFromDescription(self):
		ctx = rulebased.Context.fromDescription(
			"Airmass at observation midpoint")
		self.assertEqual(ctx.tokens, set(['airmass', 'observation', 'midpoint']))
		self.assertEqual(set([w.ucd for w in ctx.words]), set([
			'obs.calib.flat', 'instr.offset', 'obs.airMass', 'obs.field', 
			'obs', 'obs.atmos', 'meta.code.status', 'obs.param', 'obs.proposal', 
			'obs.calib']))


class RulesTest(unittest.TestCase):
	"""tests for context operation on a simple rule set.
	"""
	def setUp(self):
		self.rules = [
			rulebased.WordMatchingRule(rulebased.predWordsStartWith("pos."),
				rulebased.actAddWordsAsHyp),
			rulebased.WordMatchingRule(rulebased.predWordsStartWith("obs."),
				rulebased.actAddWordsAsHyp),
			rulebased.Rule(rulebased.predHasTok("j2000"), 
				rulebased.actAppendWord("meta.main")),
		]

	def _testHypos(self, description, expected):
		ctx = rulebased.Context.fromDescription(description)
		ctx.applyRules(self.rules)
		self.assertEqual(set(ctx.hypotheses), set(expected))

	def testAirmass(self):
		self._testHypos("Airmass", ['obs.airMass'])

	def testComplexAirmass(self):
		self._testHypos("Airmass at midpoint observation", ['obs.airMass', 
			'obs.param', 'obs.calib', 'obs.proposal', 'obs.atmos', 'obs.field', 
			'obs.calib.flat'])

	def testRA(self):
		self._testHypos("Right ascension in J2000.0", ['pos.eq.ra;meta.main', 
			'pos.eq.ra'])


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