def test_oneLineage_returnsSameLineage(self):
        lineage = Lineage(major="foo", minor="bar")

        actual = Lineage.call([lineage])
        expected = lineage

        assert actual == expected
    def test_twoLineagesSameMajorOneWithMinor_returnsOneWithMinor(self):
        l1 = Lineage(major="foo", minor="bar")
        l2 = Lineage(major="foo")

        actual = Lineage.call([l1, l2])
        expected = l1

        assert actual == expected
    def test_threeLineagesWithDiffMinorsSameLen_returnsMajor(self):
        l1 = Lineage(major="4", minor="1.3.4")
        l2 = Lineage(major="4", minor="2.3.6")
        l3 = Lineage(major="4", minor="3.3.6")

        actual = Lineage.call([l1, l2, l3])
        expected = Lineage(major="4")

        assert actual == expected
    def test_threeLineagesWithMinorsDiffLen_returnsLongest(self):
        l1 = Lineage(major="4", minor="1.3.4.5.9")
        l2 = Lineage(major="4", minor="1.3.6")
        l3 = Lineage(major="4", minor="1.3.6.8")

        actual = Lineage.call([l1, l2, l3])
        expected = Lineage(major="4", minor="1.3.4.5.9")

        assert actual == expected
    def test_threeLineagesSameMajorSameDepthMinor_returnsMRCA(self):
        l1 = Lineage(major="4", minor="1.3.4.5")
        l2 = Lineage(major="4", minor="1.3.6.6")
        l3 = Lineage(major="4", minor="1.3.6.8")

        actual = Lineage.call([l1, l2, l3])
        expected = Lineage(major="4", minor="1.3")

        assert actual == expected
    def test_emptyInput_returnsNone(self):
        lineages = []

        assert Lineage.call(lineages) is None