class TestMatchesStructure(TestCase, TestMatchersInterface):
    class SimpleClass:
        def __init__(self, x, y):
            self.x = x
            self.y = y

    matches_matcher = MatchesStructure(x=Equals(1), y=Equals(2))
    matches_matches = [SimpleClass(1, 2)]
    matches_mismatches = [
        SimpleClass(2, 2),
        SimpleClass(1, 1),
        SimpleClass(3, 3),
    ]

    str_examples = [
        ("MatchesStructure(x=Equals(1))", MatchesStructure(x=Equals(1))),
        ("MatchesStructure(y=Equals(2))", MatchesStructure(y=Equals(2))),
        ("MatchesStructure(x=Equals(1), y=Equals(2))",
         MatchesStructure(x=Equals(1), y=Equals(2))),
    ]

    describe_examples = [
        ("""\
Differences: [
1 != 3: x
]""", SimpleClass(1, 2), MatchesStructure(x=Equals(3), y=Equals(2))),
        ("""\
Differences: [
2 != 3: y
]""", SimpleClass(1, 2), MatchesStructure(x=Equals(1), y=Equals(3))),
        ("""\
Differences: [
1 != 0: x
2 != 0: y
]""", SimpleClass(1, 2), MatchesStructure(x=Equals(0), y=Equals(0))),
    ]

    def test_fromExample(self):
        self.assertThat(
            self.SimpleClass(1, 2),
            MatchesStructure.fromExample(self.SimpleClass(1, 3), 'x'))

    def test_byEquality(self):
        self.assertThat(self.SimpleClass(1, 2),
                        MatchesStructure.byEquality(x=1))

    def test_withStructure(self):
        self.assertThat(self.SimpleClass(1, 2),
                        MatchesStructure.byMatcher(LessThan, x=2))

    def test_update(self):
        self.assertThat(self.SimpleClass(1, 2),
                        MatchesStructure(x=NotEquals(1)).update(x=Equals(1)))

    def test_update_none(self):
        self.assertThat(
            self.SimpleClass(1, 2),
            MatchesStructure(x=Equals(1), z=NotEquals(42)).update(z=None))
 def test_withStructure(self):
     self.assertThat(
         self.SimpleClass(1, 2),
         MatchesStructure.byMatcher(LessThan, x=2))
 def test_byEquality(self):
     self.assertThat(
         self.SimpleClass(1, 2),
         MatchesStructure.byEquality(x=1))
 def test_fromExample(self):
     self.assertThat(
         self.SimpleClass(1, 2),
         MatchesStructure.fromExample(self.SimpleClass(1, 3), 'x'))
 def test_update(self):
     self.assertThat(self.SimpleClass(1, 2),
                     MatchesStructure(x=NotEquals(1)).update(x=Equals(1)))
 def test_withStructure(self):
     self.assertThat(self.SimpleClass(1, 2),
                     MatchesStructure.byMatcher(LessThan, x=2))
 def test_byEquality(self):
     self.assertThat(self.SimpleClass(1, 2),
                     MatchesStructure.byEquality(x=1))
 def test_fromExample(self):
     self.assertThat(
         self.SimpleClass(1, 2),
         MatchesStructure.fromExample(self.SimpleClass(1, 3), 'x'))
 def test_update_none(self):
     self.assertThat(
         self.SimpleClass(1, 2),
         MatchesStructure(x=Equals(1), z=NotEquals(42)).update(z=None))