import pyfmi.testcase
import unittest
import imp
import random

points = 5

class ProblemTests(pyfmi.testcase.SpeakingTestCase):
	truth = lambda *args, **kwargs: True
	lie = lambda *args, **kwargs: False

	@staticmethod
	def make_mod():
		return imp.new_module('m_'+str(random.randint(0, 2**31)))

	def test_empty(self):
		self.assertEqual((), self.user.module_game(self.truth))

	def test_rule0(self):
		m0 = self.make_mod()
		m0._baba = 5
		m0.l = [1, 2, [5, ], [6, (7, 302399)], 676409]
		m0.d = {'notprime': 676409 + 1, 'prime': 676409}
		self.assertEqual((6,), self.user.module_game(self.truth, m0))

	def test_rule1(self):
		m0 = self.make_mod()
		m1 = self.make_mod()
		m1.soul = self.make_mod()
		m1.soul.__name__ = 'soul';
		m1.antigravity = self.make_mod()
		m1.antigravity.__name__ = 'antigravity'
		m2 = self.make_mod()
		m2.antigravity = self.make_mod()
		m2.antigravity.__name__ = 'antigravity'
		m2.baba = self.make_mod()
		m2.baba.__name__ = 'baba'
		m2.dyado = self.make_mod()
		m2.dyado.__name__ = 'dyado'
		self.assertEqual((0, 6, 3), self.user.module_game(self.lie, m0, m1, m2))

	def test_rule2(self):
		m0 = self.make_mod()
		m0.foo = {}
		m0.oof = lambda: None
		m0.ofo = m0.oof
		m0.evangelist = {}
		m0.evilsagent = {}
		m0.evangelits = {}
		m0.evgnelitsa = m0.oof
		m0.ClintEastwood = {}
		m0.OldWestAction = {}
		self.assertEqual((4,), self.user.module_game(self.lie, m0))

	def test_rule3(self):
		m0 = self.make_mod()
		for x in range(4): setattr(m0, 'dicty%d' % x, {'wonk': 42})
		m0.notso = {}
		m1 = self.make_mod()
		m2 = self.make_mod()
		m2.a, m2.b = {'kron': 22}, {'bronk': 22}
		m2.notsoso = {}
		m2.inty = 77
		m2.biggy = 2**24
		m3 = self.make_mod()
		m4 = self.make_mod()
		m4.x = {'zronk': 99}
		predicate = lambda x: isinstance(x, dict) and bool(x)
		self.assertEqual((2, -2, 0, -2, -1), self.user.module_game(predicate, m0, m1, m2, m3, m4))
		self.assertEqual((-1, 1, -1, 0), self.user.module_game(predicate, m1, m2, m3, m4))
		

if __name__ == '__main__':
	ProblemTests.user_filename = 'p4.py'
	unittest.main()
