Esempio n. 1
0
    def test_ignore_blank_cards(self):
        """Test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/152

        Ignore blank cards.
        """

        ha = Header([('A', 1), ('B', 2), ('C', 3)])
        hb = Header([('A', 1), ('', ''), ('B', 2), ('', ''), ('C', 3)])
        hc = ha.copy()
        hc.append()
        hc.append()

        # We now have a header with interleaved blanks, and a header with end
        # blanks, both of which should ignore the blanks
        assert HeaderDiff(ha, hb).identical
        assert HeaderDiff(ha, hc).identical
        assert HeaderDiff(hb, hc).identical

        assert not HeaderDiff(ha, hb, ignore_blank_cards=False).identical
        assert not HeaderDiff(ha, hc, ignore_blank_cards=False).identical

        # Both hb and hc have the same number of blank cards; since order is
        # currently ignored, these should still be identical even if blank
        # cards are not ignored
        assert HeaderDiff(hb, hc, ignore_blank_cards=False).identical

        hc.append()
        # But now there are different numbers of blanks, so they should not be
        # ignored:
        assert not HeaderDiff(hb, hc, ignore_blank_cards=False).identical
Esempio n. 2
0
 def test_different_keyword_values(self):
     ha = Header([('A', 1), ('B', 2), ('C', 3)])
     hb = ha.copy()
     hb['C'] = 4
     diff = HeaderDiff(ha, hb)
     assert not diff.identical
     assert diff.diff_keyword_values == {'C': [(3, 4)]}
Esempio n. 3
0
 def test_floating_point_atol(self):
     ha = Header([('A', 1), ('B', 1.0), ('C', 0.0)])
     hb = ha.copy()
     hb['B'] = 1.00001
     hb['C'] = 0.000001
     diff = HeaderDiff(ha, hb, rtol=1e-6)
     assert not diff.identical
     assert (diff.diff_keyword_values ==
             {'B': [(1.0, 1.00001)], 'C': [(0.0, 0.000001)]})
     diff = HeaderDiff(ha, hb, rtol=1e-5)
     assert not diff.identical
     assert (diff.diff_keyword_values ==
             {'C': [(0.0, 0.000001)]})
     diff = HeaderDiff(ha, hb, atol=1e-6)
     assert not diff.identical
     assert (diff.diff_keyword_values ==
             {'B': [(1.0, 1.00001)]})
     diff = HeaderDiff(ha, hb, atol=1e-5)  # strict inequality
     assert not diff.identical
     assert (diff.diff_keyword_values ==
             {'B': [(1.0, 1.00001)]})
     diff = HeaderDiff(ha, hb, rtol=1e-5, atol=1e-5)
     assert diff.identical
     diff = HeaderDiff(ha, hb, atol=1.1e-5)
     assert diff.identical
     diff = HeaderDiff(ha, hb, rtol=1e-6, atol=1e-6)
     assert not diff.identical
Esempio n. 4
0
 def test_floating_point_atol(self):
     ha = Header([('A', 1), ('B', 1.0), ('C', 0.0)])
     hb = ha.copy()
     hb['B'] = 1.00001
     hb['C'] = 0.000001
     diff = HeaderDiff(ha, hb, rtol=1e-6)
     assert not diff.identical
     assert (diff.diff_keyword_values == {
         'B': [(1.0, 1.00001)],
         'C': [(0.0, 0.000001)]
     })
     diff = HeaderDiff(ha, hb, rtol=1e-5)
     assert not diff.identical
     assert (diff.diff_keyword_values == {'C': [(0.0, 0.000001)]})
     diff = HeaderDiff(ha, hb, atol=1e-6)
     assert not diff.identical
     assert (diff.diff_keyword_values == {'B': [(1.0, 1.00001)]})
     diff = HeaderDiff(ha, hb, atol=1e-5)  # strict inequality
     assert not diff.identical
     assert (diff.diff_keyword_values == {'B': [(1.0, 1.00001)]})
     diff = HeaderDiff(ha, hb, rtol=1e-5, atol=1e-5)
     assert diff.identical
     diff = HeaderDiff(ha, hb, atol=1.1e-5)
     assert diff.identical
     diff = HeaderDiff(ha, hb, rtol=1e-6, atol=1e-6)
     assert not diff.identical
Esempio n. 5
0
    def test_ignore_blank_cards(self):
        """Test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/152

        Ignore blank cards.
        """

        ha = Header([('A', 1), ('B', 2), ('C', 3)])
        hb = Header([('A', 1), ('', ''), ('B', 2), ('', ''), ('C', 3)])
        hc = ha.copy()
        hc.append()
        hc.append()

        # We now have a header with interleaved blanks, and a header with end
        # blanks, both of which should ignore the blanks
        assert HeaderDiff(ha, hb).identical
        assert HeaderDiff(ha, hc).identical
        assert HeaderDiff(hb, hc).identical

        assert not HeaderDiff(ha, hb, ignore_blank_cards=False).identical
        assert not HeaderDiff(ha, hc, ignore_blank_cards=False).identical

        # Both hb and hc have the same number of blank cards; since order is
        # currently ignored, these should still be identical even if blank
        # cards are not ignored
        assert HeaderDiff(hb, hc, ignore_blank_cards=False).identical

        hc.append()
        # But now there are different numbers of blanks, so they should not be
        # ignored:
        assert not HeaderDiff(hb, hc, ignore_blank_cards=False).identical
Esempio n. 6
0
    def test_deprecation_tolerance(self):
        """Verify uses of tolerance and rtol.
        This test should be removed in the next astropy version."""

        ha = Header([('B', 1.0), ('C', 0.1)])
        hb = ha.copy()
        hb['B'] = 1.00001
        hb['C'] = 0.100001
        with catch_warnings(AstropyDeprecationWarning) as warning_lines:
            diff = HeaderDiff(ha, hb, tolerance=1e-6)
            assert warning_lines[0].category == AstropyDeprecationWarning
            assert (str(warning_lines[0].message) == '"tolerance" was '
                    'deprecated in version 2.0 and will be removed in a '
                    'future version. Use argument "rtol" instead.')
            assert (diff.diff_keyword_values == {'C': [(0.1, 0.100001)],
                                                 'B': [(1.0, 1.00001)]})
            assert not diff.identical

        with catch_warnings(AstropyDeprecationWarning) as warning_lines:
            # `rtol` is always ignored when `tolerance` is provided
            diff = HeaderDiff(ha, hb, rtol=1e-6, tolerance=1e-5)
            assert warning_lines[0].category == AstropyDeprecationWarning
            assert (str(warning_lines[0].message) == '"tolerance" was '
                    'deprecated in version 2.0 and will be removed in a '
                    'future version. Use argument "rtol" instead.')
            assert diff.identical
Esempio n. 7
0
    def test_deprecation_tolerance(self):
        """Verify uses of tolerance and rtol.
        This test should be removed in the next astropy version."""

        ha = Header([('B', 1.0), ('C', 0.1)])
        hb = ha.copy()
        hb['B'] = 1.00001
        hb['C'] = 0.100001
        with catch_warnings(AstropyDeprecationWarning) as warning_lines:
            diff = HeaderDiff(ha, hb, tolerance=1e-6)
            assert warning_lines[0].category == AstropyDeprecationWarning
            assert (str(warning_lines[0].message) == '"tolerance" was '
                    'deprecated in version 2.0 and will be removed in a '
                    'future version. Use argument "rtol" instead.')
            assert (diff.diff_keyword_values == {'C': [(0.1, 0.100001)],
                                                 'B': [(1.0, 1.00001)]})
            assert not diff.identical

        with catch_warnings(AstropyDeprecationWarning) as warning_lines:
            # `rtol` is always ignored when `tolerance` is provided
            diff = HeaderDiff(ha, hb, rtol=1e-6, tolerance=1e-5)
            assert warning_lines[0].category == AstropyDeprecationWarning
            assert (str(warning_lines[0].message) == '"tolerance" was '
                    'deprecated in version 2.0 and will be removed in a '
                    'future version. Use argument "rtol" instead.')
            assert diff.identical
Esempio n. 8
0
 def test_different_keyword_comments(self):
     ha = Header([('A', 1), ('B', 2), ('C', 3, 'comment 1')])
     hb = ha.copy()
     hb.comments['C'] = 'comment 2'
     diff = HeaderDiff(ha, hb)
     assert not diff.identical
     assert (diff.diff_keyword_comments ==
             {'C': [('comment 1', 'comment 2')]})
Esempio n. 9
0
 def test_different_keyword_comments(self):
     ha = Header([('A', 1), ('B', 2), ('C', 3, 'comment 1')])
     hb = ha.copy()
     hb.comments['C'] = 'comment 2'
     diff = HeaderDiff(ha, hb)
     assert not diff.identical
     assert (diff.diff_keyword_comments ==
             {'C': [('comment 1', 'comment 2')]})
Esempio n. 10
0
    def test_identical_headers(self):
        ha = Header([('A', 1), ('B', 2), ('C', 3)])
        hb = ha.copy()
        assert HeaderDiff(ha, hb).identical
        assert HeaderDiff(ha.tostring(), hb.tostring()).identical

        with pytest.raises(TypeError):
            HeaderDiff(1, 2)
Esempio n. 11
0
    def test_identical_headers(self):
        ha = Header([('A', 1), ('B', 2), ('C', 3)])
        hb = ha.copy()
        assert HeaderDiff(ha, hb).identical
        assert HeaderDiff(ha.tostring(), hb.tostring()).identical

        with pytest.raises(TypeError):
            HeaderDiff(1, 2)
Esempio n. 12
0
 def test_different_keyword_values_with_duplicate(self):
     ha = Header([('A', 1), ('B', 2), ('C', 3)])
     hb = ha.copy()
     ha.append(('C', 4))
     hb.append(('C', 5))
     diff = HeaderDiff(ha, hb)
     assert not diff.identical
     assert diff.diff_keyword_values == {'C': [None, (4, 5)]}
Esempio n. 13
0
    def test_file_output_overwrite_safety(self):
        outpath = self.temp('diff_output.txt')
        ha = Header([('A', 1), ('B', 2), ('C', 3)])
        hb = ha.copy()
        hb['C'] = 4
        diffobj = HeaderDiff(ha, hb)
        diffobj.report(fileobj=outpath)

        with pytest.raises(OSError):
            diffobj.report(fileobj=outpath)
Esempio n. 14
0
 def test_file_output_from_path_string(self):
     outpath = self.temp('diff_output.txt')
     ha = Header([('A', 1), ('B', 2), ('C', 3)])
     hb = ha.copy()
     hb['C'] = 4
     diffobj = HeaderDiff(ha, hb)
     diffobj.report(fileobj=outpath)
     report_as_string = diffobj.report()
     with open(outpath) as fout:
         assert fout.read() == report_as_string
Esempio n. 15
0
 def test_different_keywords(self):
     ha = Header([('A', 1), ('B', 2), ('C', 3)])
     hb = ha.copy()
     hb['C'] = 4
     hb['D'] = (5, 'Comment')
     ha['E'] = (6, 'Comment')
     ha['F'] = (7, 'Comment')
     diff = HeaderDiff(ha, hb)
     assert not diff.identical
     assert diff.diff_keywords == (['E', 'F'], ['D'])
Esempio n. 16
0
    def test_different_keyword_count(self):
        ha = Header([('A', 1), ('B', 2), ('C', 3)])
        hb = ha.copy()
        del hb['B']
        diff = HeaderDiff(ha, hb)
        assert not diff.identical
        assert diff.diff_keyword_count == (3, 2)

        # But make sure the common keywords are at least correct
        assert diff.common_keywords == ['A', 'C']
Esempio n. 17
0
    def test_different_keyword_count(self):
        ha = Header([('A', 1), ('B', 2), ('C', 3)])
        hb = ha.copy()
        del hb['B']
        diff = HeaderDiff(ha, hb)
        assert not diff.identical
        assert diff.diff_keyword_count == (3, 2)

        # But make sure the common keywords are at least correct
        assert diff.common_keywords == ['A', 'C']
Esempio n. 18
0
 def test_different_keywords(self):
     ha = Header([('A', 1), ('B', 2), ('C', 3)])
     hb = ha.copy()
     hb['C'] = 4
     hb['D'] = (5, 'Comment')
     ha['E'] = (6, 'Comment')
     ha['F'] = (7, 'Comment')
     diff = HeaderDiff(ha, hb)
     assert not diff.identical
     assert diff.diff_keywords == (['E', 'F'], ['D'])
Esempio n. 19
0
 def test_file_output_overwrite_success(self):
     outpath = self.temp('diff_output.txt')
     ha = Header([('A', 1), ('B', 2), ('C', 3)])
     hb = ha.copy()
     hb['C'] = 4
     diffobj = HeaderDiff(ha, hb)
     diffobj.report(fileobj=outpath)
     report_as_string = diffobj.report()
     diffobj.report(fileobj=outpath, overwrite=True)
     with open(outpath) as fout:
         assert fout.read() == report_as_string, (
             "overwritten output file is not identical to report string")
Esempio n. 20
0
 def test_floating_point_rtol(self):
     ha = Header([('A', 1), ('B', 2.00001), ('C', 3.000001)])
     hb = ha.copy()
     hb['B'] = 2.00002
     hb['C'] = 3.000002
     diff = HeaderDiff(ha, hb)
     assert not diff.identical
     assert (diff.diff_keyword_values ==
             {'B': [(2.00001, 2.00002)], 'C': [(3.000001, 3.000002)]})
     diff = HeaderDiff(ha, hb, rtol=1e-6)
     assert not diff.identical
     assert diff.diff_keyword_values == {'B': [(2.00001, 2.00002)]}
     diff = HeaderDiff(ha, hb, rtol=1e-5)
     assert diff.identical
Esempio n. 21
0
 def test_floating_point_rtol(self):
     ha = Header([('A', 1), ('B', 2.00001), ('C', 3.000001)])
     hb = ha.copy()
     hb['B'] = 2.00002
     hb['C'] = 3.000002
     diff = HeaderDiff(ha, hb)
     assert not diff.identical
     assert (diff.diff_keyword_values ==
             {'B': [(2.00001, 2.00002)], 'C': [(3.000001, 3.000002)]})
     diff = HeaderDiff(ha, hb, rtol=1e-6)
     assert not diff.identical
     assert diff.diff_keyword_values == {'B': [(2.00001, 2.00002)]}
     diff = HeaderDiff(ha, hb, rtol=1e-5)
     assert diff.identical
Esempio n. 22
0
    def test_file_output_overwrite_vs_clobber(self):
        """Verify uses of clobber and overwrite."""

        outpath = self.temp('diff_output.txt')
        ha = Header([('A', 1), ('B', 2), ('C', 3)])
        hb = ha.copy()
        hb['C'] = 4
        diffobj = HeaderDiff(ha, hb)
        diffobj.report(fileobj=outpath)
        with pytest.warns(
                AstropyDeprecationWarning,
                match=r'"clobber" was '
                r'deprecated in version 2\.0 and will be removed in a '
                r'future version\. Use argument "overwrite" instead\.'):
            diffobj.report(fileobj=outpath, clobber=True)
Esempio n. 23
0
    def test_file_output_overwrite_vs_clobber(self):
        """Verify uses of clobber and overwrite."""

        outpath = self.temp('diff_output.txt')
        ha = Header([('A', 1), ('B', 2), ('C', 3)])
        hb = ha.copy()
        hb['C'] = 4
        diffobj = HeaderDiff(ha, hb)
        diffobj.report(fileobj=outpath)
        with catch_warnings(AstropyDeprecationWarning) as warning_lines:
            diffobj.report(fileobj=outpath, clobber=True)
            assert warning_lines[0].category == AstropyDeprecationWarning
            assert (str(warning_lines[0].message) == '"clobber" was '
                    'deprecated in version 2.0 and will be removed in a '
                    'future version. Use argument "overwrite" instead.')
Esempio n. 24
0
    def test_ignore_blanks(self):
        with fits.conf.set_temp('strip_header_whitespace', False):
            ha = Header([('A', 1), ('B', 2), ('C', 'A       ')])
            hb = ha.copy()
            hb['C'] = 'A'
            assert ha['C'] != hb['C']

            diff = HeaderDiff(ha, hb)
            # Trailing blanks are ignored by default
            assert diff.identical
            assert diff.diff_keyword_values == {}

            # Don't ignore blanks
            diff = HeaderDiff(ha, hb, ignore_blanks=False)
            assert not diff.identical
            assert diff.diff_keyword_values == {'C': [('A       ', 'A')]}
Esempio n. 25
0
    def test_ignore_blanks(self):
        with fits.conf.set_temp('strip_header_whitespace', False):
            ha = Header([('A', 1), ('B', 2), ('C', 'A       ')])
            hb = ha.copy()
            hb['C'] = 'A'
            assert ha['C'] != hb['C']

            diff = HeaderDiff(ha, hb)
            # Trailing blanks are ignored by default
            assert diff.identical
            assert diff.diff_keyword_values == {}

            # Don't ignore blanks
            diff = HeaderDiff(ha, hb, ignore_blanks=False)
            assert not diff.identical
            assert diff.diff_keyword_values == {'C': [('A       ', 'A')]}
Esempio n. 26
0
    def test_asymmetric_duplicate_keywords(self):
        ha = Header([('A', 1), ('B', 2), ('C', 3)])
        hb = ha.copy()
        ha.append(('A', 2, 'comment 1'))
        ha.append(('A', 3, 'comment 2'))
        hb.append(('B', 4, 'comment 3'))
        hb.append(('C', 5, 'comment 4'))
        diff = HeaderDiff(ha, hb)
        assert not diff.identical
        assert diff.diff_keyword_values == {}
        assert (diff.diff_duplicate_keywords ==
                {'A': (3, 1), 'B': (1, 2), 'C': (1, 2)})

        report = diff.report()
        assert ("Inconsistent duplicates of keyword 'A'     :\n"
                "  Occurs 3 time(s) in a, 1 times in (b)") in report
Esempio n. 27
0
    def test_asymmetric_duplicate_keywords(self):
        ha = Header([('A', 1), ('B', 2), ('C', 3)])
        hb = ha.copy()
        ha.append(('A', 2, 'comment 1'))
        ha.append(('A', 3, 'comment 2'))
        hb.append(('B', 4, 'comment 3'))
        hb.append(('C', 5, 'comment 4'))
        diff = HeaderDiff(ha, hb)
        assert not diff.identical
        assert diff.diff_keyword_values == {}
        assert (diff.diff_duplicate_keywords ==
                {'A': (3, 1), 'B': (1, 2), 'C': (1, 2)})

        report = diff.report()
        assert ("Inconsistent duplicates of keyword 'A'     :\n"
                "  Occurs 3 time(s) in a, 1 times in (b)") in report
Esempio n. 28
0
    def test_ignore_blank_cards(self, differ):
        """Test for https://aeon.stsci.edu/ssb/trac/pyfits/ticket/152

        Ignore blank cards.
        """

        ha = Header([('A', 1), ('B', 2), ('C', 3)])
        hb = Header([('A', 1), ('', ''), ('B', 2), ('', ''), ('C', 3)])
        hc = ha.copy()
        if differ is HeaderDiff:
            hc.append()
            hc.append()
        else:  # Ensure blanks are not at the end as they are stripped by HDUs
            hc.add_blank(after=-2)
            hc.add_blank(after=-2)

        if differ in (HDUDiff, FITSDiff):  # wrap it in a PrimaryHDU
            ha, hb, hc = (PrimaryHDU(np.arange(10), h) for h in (ha, hb, hc))
            hc_header = hc.header
        if differ is FITSDiff:  # wrap it in a HDUList
            ha, hb, hc = (HDUList([h]) for h in (ha, hb, hc))
            hc_header = hc[0].header

        # We now have a header with interleaved blanks, and a header with end
        # blanks, both of which should ignore the blanks
        assert differ(ha, hb).identical
        assert differ(ha, hc).identical
        assert differ(hb, hc).identical

        assert not differ(ha, hb, ignore_blank_cards=False).identical
        assert not differ(ha, hc, ignore_blank_cards=False).identical

        # Both hb and hc have the same number of blank cards; since order is
        # currently ignored, these should still be identical even if blank
        # cards are not ignored
        assert differ(hb, hc, ignore_blank_cards=False).identical

        if differ is HeaderDiff:
            hc.append()
        else:  # Ensure blanks are not at the end as they are stripped by HDUs
            hc_header.add_blank(after=-2)
        # But now there are different numbers of blanks, so they should not be
        # ignored:
        assert not differ(hb, hc, ignore_blank_cards=False).identical
Esempio n. 29
0
    def test_ignore_keyword_comments(self):
        ha = Header([('A', 1, 'A'), ('B', 2, 'B'), ('C', 3, 'C')])
        hb = ha.copy()
        hb.comments['B'] = 'D'
        hb.comments['C'] = 'E'
        diff = HeaderDiff(ha, hb, ignore_comments=['*'])
        assert diff.identical
        diff = HeaderDiff(ha, hb, ignore_comments=['B'])
        assert not diff.identical
        assert diff.diff_keyword_comments == {'C': [('C', 'E')]}

        report = diff.report()
        assert 'Keyword B        has different comments' not in report
        assert 'Keyword C        has different comments' in report

        # Test case-insensitivity
        diff = HeaderDiff(ha, hb, ignore_comments=['b'])
        assert not diff.identical
        assert diff.diff_keyword_comments == {'C': [('C', 'E')]}
Esempio n. 30
0
    def test_ignore_keyword_values(self):
        ha = Header([('A', 1), ('B', 2), ('C', 3)])
        hb = ha.copy()
        hb['B'] = 4
        hb['C'] = 5
        diff = HeaderDiff(ha, hb, ignore_keywords=['*'])
        assert diff.identical
        diff = HeaderDiff(ha, hb, ignore_keywords=['B'])
        assert not diff.identical
        assert diff.diff_keyword_values == {'C': [(3, 5)]}

        report = diff.report()
        assert 'Keyword B        has different values' not in report
        assert 'Keyword C        has different values' in report

        # Test case-insensitivity
        diff = HeaderDiff(ha, hb, ignore_keywords=['b'])
        assert not diff.identical
        assert diff.diff_keyword_values == {'C': [(3, 5)]}
Esempio n. 31
0
    def test_ignore_keyword_values(self):
        ha = Header([('A', 1), ('B', 2), ('C', 3)])
        hb = ha.copy()
        hb['B'] = 4
        hb['C'] = 5
        diff = HeaderDiff(ha, hb, ignore_keywords=['*'])
        assert diff.identical
        diff = HeaderDiff(ha, hb, ignore_keywords=['B'])
        assert not diff.identical
        assert diff.diff_keyword_values == {'C': [(3, 5)]}

        report = diff.report()
        assert 'Keyword B        has different values' not in report
        assert 'Keyword C        has different values' in report

        # Test case-insensitivity
        diff = HeaderDiff(ha, hb, ignore_keywords=['b'])
        assert not diff.identical
        assert diff.diff_keyword_values == {'C': [(3, 5)]}
Esempio n. 32
0
    def test_ignore_keyword_comments(self):
        ha = Header([('A', 1, 'A'), ('B', 2, 'B'), ('C', 3, 'C')])
        hb = ha.copy()
        hb.comments['B'] = 'D'
        hb.comments['C'] = 'E'
        diff = HeaderDiff(ha, hb, ignore_comments=['*'])
        assert diff.identical
        diff = HeaderDiff(ha, hb, ignore_comments=['B'])
        assert not diff.identical
        assert diff.diff_keyword_comments == {'C': [('C', 'E')]}

        report = diff.report()
        assert 'Keyword B        has different comments' not in report
        assert 'Keyword C        has different comments' in report

        # Test case-insensitivity
        diff = HeaderDiff(ha, hb, ignore_comments=['b'])
        assert not diff.identical
        assert diff.diff_keyword_comments == {'C': [('C', 'E')]}
Esempio n. 33
0
 def test_common_keywords(self):
     ha = Header([('A', 1), ('B', 2), ('C', 3)])
     hb = ha.copy()
     hb['C'] = 4
     hb['D'] = (5, 'Comment')
     assert HeaderDiff(ha, hb).common_keywords == ['A', 'B', 'C']
Esempio n. 34
0
 def test_slightly_different_headers(self):
     ha = Header([('A', 1), ('B', 2), ('C', 3)])
     hb = ha.copy()
     hb['C'] = 4
     assert not HeaderDiff(ha, hb).identical
Esempio n. 35
0
 def test_slightly_different_headers(self):
     ha = Header([('A', 1), ('B', 2), ('C', 3)])
     hb = ha.copy()
     hb['C'] = 4
     assert not HeaderDiff(ha, hb).identical
Esempio n. 36
0
 def test_common_keywords(self):
     ha = Header([('A', 1), ('B', 2), ('C', 3)])
     hb = ha.copy()
     hb['C'] = 4
     hb['D'] = (5, 'Comment')
     assert HeaderDiff(ha, hb).common_keywords == ['A', 'B', 'C']