def test_matches(self):
     cases = [
         sut.StringDetail('s'),
         sut.PreFormattedStringDetail('pre-formatted', True),
         sut.HeaderAndValueDetail('header', ()),
         sut.TreeDetail(sut.Node('header', None, (), ())),
     ]
     for line_object in cases:
         with self.subTest(str(type(line_object))):
             sut.is_any_detail().apply_without_message(self, line_object)
 def test_matches(self):
     expected_string = 'expected string'
     cases = [
         NEA('default',
             expected=
             sut.is_string_detail(),
             actual=
             sut.StringDetail('anything'),
             ),
         NEA('string',
             expected=
             sut.is_string_detail(to_string_object=asrt_to_string.equals(expected_string)),
             actual=
             sut.StringDetail(expected_string)
             ),
     ]
     for case in cases:
         with self.subTest(case.name):
             case.expected.apply_without_message(self, case.actual)
 def test_not_matches(self):
     cases = [
         NEA('unexpected object type',
             expected=
             sut.is_string_detail(),
             actual=
             sut.PreFormattedStringDetail('s'),
             ),
         NEA('string',
             expected=
             sut.is_string_detail(to_string_object=asrt_to_string.equals('expected')),
             actual=
             sut.StringDetail('actual'),
             ),
     ]
     for case in cases:
         with self.subTest(case.name):
             assert_that_assertion_fails(case.expected, case.actual)
 def test_not_matches(self):
     cases = [
         NEA('unexpected object type',
             expected=
             sut.is_pre_formatted_string_detail(),
             actual=
             sut.StringDetail('s'),
             ),
         NEA('string',
             expected=
             sut.is_pre_formatted_string_detail(to_string_object=asrt_to_string.equals('expected')),
             actual=
             sut.PreFormattedStringDetail('actual', True),
             ),
         NEA('string is line ended',
             expected=
             sut.is_pre_formatted_string_detail(string_is_line_ended=asrt.equals(True)),
             actual=
             sut.PreFormattedStringDetail('anything', False),
             ),
     ]
     for case in cases:
         with self.subTest(case.name):
             assert_that_assertion_fails(case.expected, case.actual)
class TestEqualsDetail(unittest.TestCase):
    DETAILS = [
        _EqDetailCase(
            sut.StringDetail(S_e),
            [
                NameAndValue('unexpected type',
                             sut.PreFormattedStringDetail(S_e)
                             ),
                NameAndValue('unexpected value',
                             sut.StringDetail(S_ue)
                             ),
            ]
        ),
        _EqDetailCase(
            sut.PreFormattedStringDetail(S_e),
            [
                NameAndValue('unexpected type',
                             sut.StringDetail(S_e)
                             ),
                NameAndValue('unexpected value',
                             sut.PreFormattedStringDetail('unexpected')
                             ),
            ]
        ),
        _EqDetailCase(
            sut.HeaderAndValueDetail(HEADER_e, ()),
            [
                NameAndValue('unexpected type',
                             sut.StringDetail(HEADER_e)
                             ),
                NameAndValue('unexpected header',
                             sut.HeaderAndValueDetail(HEADER_ue, ())
                             ),
                NameAndValue('unexpected details',
                             sut.HeaderAndValueDetail(HEADER_e, [sut.StringDetail(S_e)])
                             ),
            ]
        ),
        _EqDetailCase(
            sut.IndentedDetail([sut.StringDetail(S_e)]),
            [
                NameAndValue('unexpected type',
                             sut.StringDetail(HEADER_e)
                             ),
                NameAndValue('unexpected number of children',
                             sut.IndentedDetail([])
                             ),
                NameAndValue('unexpected child',
                             sut.IndentedDetail([sut.StringDetail(S_ue)])
                             ),
            ]
        ),
        _EqDetailCase(
            sut.TreeDetail(sut.Node(HEADER_e, None, [STRING_DETAIL_e], [])),
            [
                NameAndValue('unexpected type',
                             sut.StringDetail(HEADER_e)
                             ),
                NameAndValue('unexpected header',
                             sut.TreeDetail(sut.Node(HEADER_ue, None, [STRING_DETAIL_e], []))
                             ),
                NameAndValue('unexpected number of details',
                             sut.TreeDetail(sut.Node(HEADER_e, None, [], []))
                             ),
                NameAndValue('unexpected child detail',
                             sut.TreeDetail(sut.Node(HEADER_e, None, [STRING_DETAIL_ue], []))
                             ),
            ]
        ),
    ]

    def test_not_equals(self):
        for case in self.DETAILS:
            assertion = sut.equals_detail(case.expected)
            for unexpected in case.unexpected:
                with self.subTest(type=type(case.expected),
                                  unexpected=unexpected.name):
                    assert_that_assertion_fails(assertion, unexpected.value)
                 name: str,
                 expected: sut.Node,
                 unexpected: Sequence[NameAndValue[sut.Node]],
                 ):
        self.name = name
        self.expected = expected
        self.unexpected = unexpected


HEADER_e = 'expected header'
HEADER_ue = 'unexpected header'
DATA_e = 'expected data'
DATA_ue = 'unexpected data'
S_e = 'expected'
S_ue = 'unexpected'
STRING_DETAIL_e = sut.StringDetail(S_e)
STRING_DETAIL_ue = sut.StringDetail(S_ue)


class TestEqualsDetail(unittest.TestCase):
    DETAILS = [
        _EqDetailCase(
            sut.StringDetail(S_e),
            [
                NameAndValue('unexpected type',
                             sut.PreFormattedStringDetail(S_e)
                             ),
                NameAndValue('unexpected value',
                             sut.StringDetail(S_ue)
                             ),
            ]