def test_pretty_one_line(self):
        constraints = HandConstraints()
        self.assertEqual(constraints.pretty_one_line(), "?")
        constraints.set_min_hcp(3)
        constraints.set_min_length(CLUBS, 3)
        self.assertEqual(constraints.pretty_one_line(), "3+ hcp, 3+C")

        constraints = HandConstraints()
        constraints.set_min_hcp(3)
        constraints.set_min_length(CLUBS, 3)
        constraints.set_min_length(DIAMONDS, 3)
        self.assertEqual(constraints.pretty_one_line(), "3+ hcp, 3+C 3+D")
    def test_compute_implied_suit_length_ranges(self):
        constraints = HandConstraints()
        constraints.set_min_length(CLUBS, 3)
        constraints.set_min_length(DIAMONDS, 3)
        constraints.set_min_length(HEARTS, 3)
        self.assertEqual(constraints.max_length(SPADES), 4)

        constraints = HandConstraints()
        constraints.set_max_length(CLUBS, 5)
        constraints.set_longest_suit(CLUBS)
        self.assertEqual(constraints.pretty_one_line(), "? hcp, 4-5C 0-5D 0-5H 0-5S")

        constraints = HandConstraints()
        constraints.set_max_length(CLUBS, 5)
        constraints.set_longest_suit(CLUBS, except_suits=[HEARTS])
        self.assertEqual(constraints.pretty_one_line(), "? hcp, 4-5C 0-5D 0-5S")

        constraints = HandConstraints()
        constraints.set_min_length(DIAMONDS, 3)
        constraints.set_longer_minor(DIAMONDS)
        self.assertEqual(constraints.min_length(DIAMONDS), 3)
        constraints.set_min_length(CLUBS, 4)
        self.assertEqual(constraints.min_length(DIAMONDS), 4)

        constraints = HandConstraints()
        constraints.set_min_length(HEARTS, 3)
        constraints.set_longer_major(HEARTS)
        self.assertEqual(constraints.min_length(HEARTS), 3)
        constraints.set_min_length(SPADES, 4)
        self.assertEqual(constraints.min_length(HEARTS), 4)