import parasail
from unittest import TestCase,  main
import pytest
import platform

class Tests(TestCase):

    def test1(self):
        result = parasail.sw_table("asdf", "asdfasdf", 10, 1, parasail.blosum62)
        print(result)
        print(result.saturated)
        print(result.score)
        with self.assertRaises(AttributeError):
            print(result.matches)
        with self.assertRaises(AttributeError):
            print(result.similar)
        with self.assertRaises(AttributeError):
            print(result.length)
        print(result.score_table)

    def test2(self):
        result = parasail.sw_stats_table("asdf", "asdfasdf", 10, 1, parasail.blosum62)
        print(result)
        print(result.saturated)
        print(result.score)
        print(result.matches)
        print(result.similar)
        print(result.length)
        print(result.score_table)
        print(result.matches_table)
        print(result.similar_table)
        print(result.length_table)

    def test3(self):
        result = parasail.sw_rowcol("asdf", "asdfasdf", 10, 1, parasail.blosum62)
        print(result)
        print(result.saturated)
        print(result.score)
        with self.assertRaises(AttributeError):
            print(result.matches)
        with self.assertRaises(AttributeError):
            print(result.similar)
        with self.assertRaises(AttributeError):
            print(result.length)
        print(result.score_row)
        print(result.score_col)

    def test4(self):
        result = parasail.sw_stats_rowcol("asdf", "asdfasdf", 10, 1, parasail.blosum62)
        print(result)
        print(result.saturated)
        print(result.score)
        print(result.matches)
        print(result.similar)
        print(result.length)
        print(result.score_row)
        print(result.score_col)
        print(result.matches_row)
        print(result.matches_col)
        print(result.similar_row)
        print(result.similar_col)
        print(result.length_row)
        print(result.length_col)

    def test5(self):
        result = parasail.sw("asdf", "asdf", 10, 1, parasail.blosum62)
        print(result)
        print(result.saturated)
        print(result.score)
        with self.assertRaises(AttributeError):
            print(result.matches)
        with self.assertRaises(AttributeError):
            print(result.similar)
        with self.assertRaises(AttributeError):
            print(result.length)
        with self.assertRaises(AttributeError):
            print(result.score_table)

    @pytest.mark.skipif(platform.uname().machine=='aarch64', reason="FIXME: test6 ends up in Segmentation fault on arm64")
    def test6(self):
        result = parasail.sw_stats("asdf", "asdf", 10, 1, parasail.blosum62)
        print(result)
        print(result.saturated)
        print(result.score)
        print(result.matches)
        print(result.similar)
        print(result.length)

    @pytest.mark.skipif(platform.uname().machine=='aarch64', reason="FIXME: test7 ends up in Segmentation fault on arm64")
    def test7(self):
        result = parasail.sw_scan_32("asdf", "asdf", 10, 1, parasail.blosum62)
        print(result)
        print(result.saturated)
        print(result.score)
        with self.assertRaises(AttributeError):
            print(result.matches)
        with self.assertRaises(AttributeError):
            print(result.similar)
        with self.assertRaises(AttributeError):
            print(result.length)

    @pytest.mark.skipif(platform.uname().machine=='aarch64', reason="FIXME: test8 ends up in Segmentation fault on arm64")
    def test8(self):
        result = parasail.sw_scan_16("asdf", "asdf", 10, 1, parasail.blosum62)
        print(result)
        print(result.saturated)
        print(result.score)
        with self.assertRaises(AttributeError):
            print(result.matches)
        with self.assertRaises(AttributeError):
            print(result.similar)
        with self.assertRaises(AttributeError):
            print(result.length)

    def test9(self):
        result = parasail.sw_stats_striped_16("asdf", "asdf", 10, 1, parasail.blosum62)
        print(result)
        print(result.saturated)
        print(result.score)
        if platform.uname().machine != 'aarch64':
            print(result.matches)
            print(result.similar)
            print(result.length)
        else:
            print("On architecture aarch64 this test runs into: AttributeError: 'Result' object has no stats")

        print(parasail.blosum62.name)
        print(parasail.blosum62.size)
        print(parasail.blosum62.matrix)

        if platform.uname().machine != 'aarch64':
            profile = parasail.profile_create_8("asdf",  parasail.blosum62)
            profile = parasail.profile_create_8("asdf",  parasail.blosum62)
            print(profile)
            print(profile.s1)
            print(profile.matrix)

            result = parasail.sw_striped_profile_8(profile, "asdf", 10, 1)
            print(result)
            print(result.saturated)
            print(result.score)
        else:
            print("On architecture aarch64 this test runs into: Segmentation fault")

    @pytest.mark.skipif(platform.uname().machine=='aarch64', reason="FIXME: test10 ends up in Segmentation fault on arm64")
    def test10(self):
        profile = parasail.profile_create_sat("asdf",  parasail.blosum62)
        print(profile)
        print(profile.s1)
        print(profile.matrix)
        print(dir(profile.matrix))
        print(profile.matrix.min)
        print(profile.matrix.max)
        print(profile.matrix.size)

        result = parasail.sw_striped_profile_sat(profile, "asdf", 10, 1)
        print(result)
        print(result.saturated)
        print(result.score)
        print(type(result.score))


if __name__ == '__main__':
    main()
