unit 0.26.2

A self-replicating software nanobot — minimal Forth interpreter that is also a networked mesh agent
import unittest
import sexp
import challenge


class TestChallenge(unittest.TestCase):
    def test_on_challenge(self):
        store = challenge.ChallengeStore()
        parsed = sexp.parse('(challenge :id 42 :name "fib10" :target "55 " :reward 100 :seeds ("a"))')
        store.on_challenge(parsed)
        ch = store.get(42)
        self.assertIsNotNone(ch)
        self.assertEqual(ch.name, 'fib10')
        self.assertEqual(ch.reward, 100)

    def test_on_solution(self):
        store = challenge.ChallengeStore()
        store.add(challenge.Challenge(42, 'test', '55 '))
        parsed = sexp.parse('(solution :challenge-id 42 :program "(+ 5 50)" :solver "aa")')
        store.on_solution(parsed)
        ch = store.get(42)
        self.assertTrue(ch.solved)

    def test_get_unsolved(self):
        store = challenge.ChallengeStore()
        store.add(challenge.Challenge(1, 'low', '10 ', 50))
        store.add(challenge.Challenge(2, 'high', '99 ', 200))
        store.add(challenge.Challenge(3, 'done', '1 ', 300))
        store.get(3).solved = True
        unsolved = store.get_unsolved()
        self.assertEqual(len(unsolved), 2)
        self.assertEqual(unsolved[0].name, 'high')

    def test_count(self):
        store = challenge.ChallengeStore()
        store.add(challenge.Challenge(1, 'a', '10 '))
        store.add(challenge.Challenge(2, 'b', '20 '))
        store.get(2).solved = True
        total, solved = store.count()
        self.assertEqual(total, 2)
        self.assertEqual(solved, 1)

    def test_format_solution(self):
        s = challenge.format_solution(42, '(+ 5 50)', 'aabb')
        parsed = sexp.parse(s)
        self.assertEqual(sexp.msg_type(parsed), 'solution')

    def test_try_evolve(self):
        ch = challenge.Challenge(1, 'test', '55 ', 100)
        program, found = challenge.try_evolve_solution(ch, seed=42)
        self.assertIsInstance(program, str)
        self.assertTrue(len(program) > 0)


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