import tempfile
import unittest

from commitlist import CommitList


class TestCommitList(unittest.TestCase):
    def test_create_new(self):
        with tempfile.TemporaryDirectory() as tempdir:
            commit_list_path = f"{tempdir}/commitlist.csv"
            commit_list = CommitList.create_new(
                commit_list_path, "v1.5.0", "6000dca5df"
            )
            self.assertEqual(len(commit_list.commits), 33)
            self.assertEqual(commit_list.commits[0].commit_hash, "7335f079abb")
            self.assertTrue(
                commit_list.commits[0].title.startswith("[pt][quant] qmul and qadd")
            )
            self.assertEqual(commit_list.commits[-1].commit_hash, "6000dca5df6")
            self.assertTrue(
                commit_list.commits[-1].title.startswith(
                    "[nomnigraph] Copy device option when customize "
                )
            )

    def test_read_write(self):
        with tempfile.TemporaryDirectory() as tempdir:
            commit_list_path = f"{tempdir}/commitlist.csv"
            initial = CommitList.create_new(commit_list_path, "v1.5.0", "7543e7e558")
            initial.write_to_disk()

            expected = CommitList.from_existing(commit_list_path)
            expected.commits[-2].category = "foobar"
            expected.write_to_disk()

            commit_list = CommitList.from_existing(commit_list_path)
            for commit, expected_commit in zip(commit_list.commits, expected.commits):
                self.assertEqual(commit, expected_commit)

    def test_update_to(self):
        with tempfile.TemporaryDirectory() as tempdir:
            commit_list_path = f"{tempdir}/commitlist.csv"
            initial = CommitList.create_new(commit_list_path, "v1.5.0", "7543e7e558")
            initial.commits[-2].category = "foobar"
            self.assertEqual(len(initial.commits), 2143)
            initial.write_to_disk()

            commit_list = CommitList.from_existing(commit_list_path)
            commit_list.update_to("5702a28b26")
            self.assertEqual(len(commit_list.commits), 2143 + 4)
            self.assertEqual(commit_list.commits[-5], initial.commits[-1])


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