Exemplo n.º 1
0
    def test_mapping(self):
        required = {'AAA': 'a', 'BBB': 'b', 'CCC': 'c'}

        data = {'AAA': 'a', 'BBB': 'b', 'CCC': 'c'}
        result = _compare_mapping(data, required)
        self.assertEqual(result, {})

        data = {'AAA': 'a', 'BBB': 'b', 'CCC': 'c', 'DDD': '3'}
        result = _compare_mapping(data, required)
        self.assertEqual(result, {'DDD': xExtra('3')})

        data = {'AAA': 'a', 'CCC': 'c', 'DDD': '3'}
        result = _compare_mapping(data, required)
        self.assertEqual(result, {'BBB': xMissing('b'), 'DDD': xExtra('3')})
Exemplo n.º 2
0
    def test_iterable(self):
        required = set(['a', 'b', 'c'])

        data = iter(['a', 'b', 'c'])
        result = _compare_set(data, required)
        self.assertEqual(result, [])

        data = iter(['a', 'b', 'c', '3'])
        result = _compare_set(data, required)
        self.assertEqual(result, [xExtra('3')])

        data = iter(['a', 'c', '3'])
        result = _compare_set(data, required)
        result = set(result)
        self.assertEqual(result, set([xMissing('b'), xExtra('3')]))
Exemplo n.º 3
0
    def test_mapping(self):
        required = set(['a', 'b', 'c'])

        data = {'AAA': 'a', 'BBB': 'b', 'CCC': 'c'}
        result = _compare_set(data, required)
        self.assertEqual(result, [])

        data = {'AAA': 'a', 'BBB': 'b', 'CCC': 'c', 'DDD': '3'}
        result = _compare_set(data, required)
        self.assertEqual(result, [xExtra('3')])

        data = {'AAA': 'a', 'CCC': 'c', 'DDD': '3'}
        result = _compare_set(data, required)
        result = set(result)
        self.assertEqual(result, set([xMissing('b'), xExtra('3')]))
Exemplo n.º 4
0
    def test_sequence(self):
        required = ['a', 'b', 'c']

        data = ['a', 'b', 'c']
        result = _compare_sequence(data, required)
        self.assertEqual(result, {})

        data = ['a', 'b', 'c', 'd']
        result = _compare_sequence(data, required)
        self.assertEqual(result, {3: xExtra('d')})

        data = ['a', 'b']
        result = _compare_sequence(data, required)
        self.assertEqual(result, {2: xMissing('c')})

        data = ['a', 'x', 'c', 'y']
        result = _compare_sequence(data, required)
        self.assertEqual(result, {1: xInvalid('x', 'b'), 3: xExtra('y')})
Exemplo n.º 5
0
    def test_notfound_comparisons(self):
        diff = _xgetdiff('a', _xNOTFOUND)
        self.assertEqual(diff, xExtra('a'))

        diff = _xgetdiff(_xNOTFOUND, 'b')
        self.assertEqual(diff, xMissing('b'))

        # For numeric comparisons, _xNOTFOUND behaves like None.
        diff = _xgetdiff(5, _xNOTFOUND)
        self.assertEqual(diff, xDeviation(+5, None))

        diff = _xgetdiff(0, _xNOTFOUND)
        self.assertEqual(diff, xDeviation(0, None))

        diff = _xgetdiff(_xNOTFOUND, 6)
        self.assertEqual(diff, xDeviation(-6, 6))  # <- Assymetric behavior
        #    (see None vs numeric)!

        diff = _xgetdiff(_xNOTFOUND, 0)
        self.assertEqual(diff, xDeviation(None, 0))
def assertSubjectUnique(self, columns, msg=None, **kwds_filter):
    """Test that values in column or *columns* of subject are unique.
    Any duplicate values are raised as Extra differences.

    .. warning::

        This method is unoptimized---it performs all operations
        in-memory. Avoid using this method on data sets that exceed
        available memory.

    .. todo::

        Optimize for memory usage (see issue #9 in development
        repository). Move functionality into compare.py when
        preparing for better py.test integration.
    """
    if isinstance(columns, str):
        get_value = lambda row: row[columns]
    elif isinstance(columns, Sequence):
        get_value = lambda row: tuple(row[column] for column in columns)
    else:
        raise TypeError('colums must be str or sequence')

    seen_before = set()
    extras = set()
    for row in self.subject.filter_rows(**kwds_filter):
        values =get_value(row)
        if values in seen_before:
            extras.add(values)
        else:
            seen_before.add(values)

    if extras:
        differences = sorted([xExtra(x) for x in extras])
        default_msg = 'values in {0!r} are not unique'.format(columns)
        self.fail(msg or default_msg, differences)
Exemplo n.º 7
0
    def test_compare(self):
        a = CompareSet(['aaa', 'bbb', 'ddd'])
        b = CompareSet(['aaa', 'bbb', 'ccc'])
        expected = [xExtra('ddd'), xMissing('ccc')]
        self.assertEqual(expected, a.compare(b))

        a = CompareSet(['aaa', 'bbb', 'ccc'])
        b = CompareSet(['aaa', 'bbb', 'ccc'])
        self.assertEqual([], a.compare(b), ('When there is no difference, '
                                            'compare should return an empty '
                                            'list.'))

        # Test callable other (all True).
        result = a.compare(lambda x: len(x) == 3)
        self.assertEqual([], result)

        # Test callable other (some False).
        result = a.compare(lambda x: x.startswith('b'))
        expected = set([xInvalid('aaa'), xInvalid('ccc')])
        self.assertEqual(expected, set(result))

        # Test callable other, multiple arguments (all True).
        a = CompareSet([(1, 1), (1, 2), (2, 1), (2, 2)])
        result = a.compare(lambda x, y: x + y > 0)
        self.assertEqual([], result)

        # Test callable other, using single vararg (all True).
        a = CompareSet([(1, 1), (1, 2), (2, 1), (2, 2)])
        result = a.compare(lambda *x: x[0] + x[1] > 0)
        self.assertEqual([], result)

        # Test callable other, multiple arguments (some False).
        a = CompareSet([(1, 1), (1, 2), (2, 1), (2, 2)])
        result = a.compare(lambda x, y: x != y)
        expected = set([xInvalid((1, 1)), xInvalid((2, 2))])
        self.assertEqual(expected, set(result))

        # Test subset (less-than-or-equal).
        a = CompareSet(['aaa', 'bbb', 'ddd'])
        b = CompareSet(['aaa', 'bbb', 'ccc'])
        expected = [xExtra('ddd')]
        self.assertEqual(expected, a.compare(b, op='<='))

        # Test strict subset (less-than).
        a = CompareSet(['aaa', 'bbb'])
        b = CompareSet(['aaa', 'bbb', 'ccc'])
        self.assertEqual([], a.compare(b, op='<'))

        # Test strict subset (less-than) assertion violation.
        a = CompareSet(['aaa', 'bbb', 'ccc'])
        b = CompareSet(['aaa', 'bbb', 'ccc'])
        self.assertEqual([xNotProperSubset()], a.compare(b, op='<'))

        # Test superset (greater-than-or-equal).
        a = CompareSet(['aaa', 'bbb', 'ccc'])
        b = CompareSet(['aaa', 'bbb', 'ddd'])
        expected = [xMissing('ddd')]
        self.assertEqual(expected, a.compare(b, op='>='))

        # Test superset subset (greater-than).
        a = CompareSet(['aaa', 'bbb', 'ccc'])
        b = CompareSet(['aaa', 'bbb'])
        self.assertEqual([], a.compare(b, op='>'))

        # Test superset subset (greater-than) assertion violation.
        a = CompareSet(['aaa', 'bbb', 'ccc'])
        b = CompareSet(['aaa', 'bbb', 'ccc'])
        self.assertEqual([xNotProperSuperset()], a.compare(b, op='>'))