Skip to content

Commit

Permalink
Merge pull request #52 from mgorny/pytest
Browse files Browse the repository at this point in the history
Minimal conversion to pytest+hypothesis
  • Loading branch information
fzumstein authored Oct 21, 2022
2 parents cd8af94 + 82dfd88 commit aa30b51
Show file tree
Hide file tree
Showing 5 changed files with 139 additions and 134 deletions.
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ htmlcov/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*,cover

Expand Down
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,4 @@ install:
- pip install -r dev-requirements.txt
- python setup.py install

script: nosetests
script: pytest -vv
4 changes: 2 additions & 2 deletions dev-requirements.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
nose
git+https://github.com/ZoomerAnalytics/nose-random.git
hypothesis
pytest
130 changes: 0 additions & 130 deletions tests/__init__.py
Original file line number Diff line number Diff line change
@@ -1,130 +0,0 @@
import sys
import unittest

from jsondiff import diff, replace, add, discard, insert, delete, update, JsonDiffer

from .utils import generate_random_json, perturbate_json

from nose_random import randomize


class JsonDiffTests(unittest.TestCase):

def test_a(self):

self.assertEqual({}, diff(1, 1))
self.assertEqual({}, diff(True, True))
self.assertEqual({}, diff('abc', 'abc'))
self.assertEqual({}, diff([1, 2], [1, 2]))
self.assertEqual({}, diff((1, 2), (1, 2)))
self.assertEqual({}, diff({1, 2}, {1, 2}))
self.assertEqual({}, diff({'a': 1, 'b': 2}, {'a': 1, 'b': 2}))
self.assertEqual({}, diff([], []))
self.assertEqual({}, diff(None, None))
self.assertEqual({}, diff({}, {}))
self.assertEqual({}, diff(set(), set()))

self.assertEqual(2, diff(1, 2))
self.assertEqual(False, diff(True, False))
self.assertEqual('def', diff('abc', 'def'))
self.assertEqual([3, 4], diff([1, 2], [3, 4]))
self.assertEqual((3, 4), diff((1, 2), (3, 4)))
self.assertEqual({3, 4}, diff({1, 2}, {3, 4}))
self.assertEqual({replace: {'c': 3, 'd': 4}}, diff({'a': 1, 'b': 2}, {'c': 3, 'd': 4}))

self.assertEqual({replace: {'c': 3, 'd': 4}}, diff([1, 2], {'c': 3, 'd': 4}))
self.assertEqual(123, diff({'a': 1, 'b': 2}, 123))

self.assertEqual({delete: ['b']}, diff({'a': 1, 'b': 2}, {'a': 1}))
self.assertEqual({'b': 3}, diff({'a': 1, 'b': 2}, {'a': 1, 'b': 3}))
self.assertEqual({'c': 3}, diff({'a': 1, 'b': 2}, {'a': 1, 'b': 2, 'c': 3}))
self.assertEqual({delete: ['b'], 'c': 3}, diff({'a': 1, 'b': 2}, {'a': 1, 'c': 3}))

self.assertEqual({add: {3}}, diff({1, 2}, {1, 2, 3}))
self.assertEqual({add: {3}, discard: {4}}, diff({1, 2, 4}, {1, 2, 3}))
self.assertEqual({discard: {4}}, diff({1, 2, 4}, {1, 2}))

self.assertEqual({insert: [(1, 'b')]}, diff(['a', 'c'], ['a', 'b', 'c']))
self.assertEqual({insert: [(1, 'b')], delete: [3, 0]}, diff(['x', 'a', 'c', 'x'], ['a', 'b', 'c']))
self.assertEqual(
{insert: [(2, 'b')], delete: [4, 0], 1: {'v': 20}},
diff(['x', 'a', {'v': 11}, 'c', 'x'], ['a', {'v': 20}, 'b', 'c'])
)
self.assertEqual(
{insert: [(2, 'b')], delete: [4, 0], 1: {'v': 20}},
diff(['x', 'a', {'u': 10, 'v': 11}, 'c', 'x'], ['a', {'u': 10, 'v': 20}, 'b', 'c'])
)

def test_marshal(self):
differ = JsonDiffer()

d = {
delete: 3,
'$delete': 4,
insert: 4,
'$$something': 1
}

dm = differ.marshal(d)

self.assertEqual(d, differ.unmarshal(dm))

def generate_scenario(self, rng):
a = generate_random_json(rng, sets=True)
b = perturbate_json(a, rng, sets=True)
return a, b

def generate_scenario_no_sets(self, rng):
a = generate_random_json(rng, sets=False)
b = perturbate_json(a, rng, sets=False)
return a, b

@randomize(1000, generate_scenario_no_sets)
def test_dump(self, scenario):
a, b = scenario
diff(a, b, syntax='compact', dump=True)
diff(a, b, syntax='explicit', dump=True)
diff(a, b, syntax='symmetric', dump=True)

@randomize(1000, generate_scenario)
def test_compact_syntax(self, scenario):
a, b = scenario
differ = JsonDiffer(syntax='compact')
d = differ.diff(a, b)
self.assertEqual(b, differ.patch(a, d))
dm = differ.marshal(d)
self.assertEqual(d, differ.unmarshal(dm))


@randomize(1000, generate_scenario)
def test_explicit_syntax(self, scenario):
a, b = scenario
differ = JsonDiffer(syntax='explicit')
d = differ.diff(a, b)
# self.assertEqual(b, differ.patch(a, d))
dm = differ.marshal(d)
self.assertEqual(d, differ.unmarshal(dm))

@randomize(1000, generate_scenario)
def test_symmetric_syntax(self, scenario):
a, b = scenario
differ = JsonDiffer(syntax='symmetric')
d = differ.diff(a, b)
self.assertEqual(b, differ.patch(a, d))
self.assertEqual(a, differ.unpatch(b, d))
dm = differ.marshal(d)
self.assertEqual(d, differ.unmarshal(dm))

def test_long_arrays(self):
size = 100
a = [{'a': i, 'b': 2 * i} for i in range(1, size)]
b = [{'a': i, 'b': 3 * i} for i in range(1, size)]
r = sys.getrecursionlimit()
sys.setrecursionlimit(size - 1)

try:
diff(a, b)
except RecursionError:
self.fail('cannot diff long arrays')
finally:
sys.setrecursionlimit(r)
136 changes: 136 additions & 0 deletions tests/test_jsondiff.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
import sys
import unittest

from jsondiff import diff, replace, add, discard, insert, delete, update, JsonDiffer

from .utils import generate_random_json, perturbate_json

from hypothesis import given, settings, strategies


def generate_scenario(rng):
a = generate_random_json(rng, sets=True)
b = perturbate_json(a, rng, sets=True)
return a, b


def generate_scenario_no_sets(rng):
a = generate_random_json(rng, sets=False)
b = perturbate_json(a, rng, sets=False)
return a, b


class JsonDiffTests(unittest.TestCase):

def test_a(self):

self.assertEqual({}, diff(1, 1))
self.assertEqual({}, diff(True, True))
self.assertEqual({}, diff('abc', 'abc'))
self.assertEqual({}, diff([1, 2], [1, 2]))
self.assertEqual({}, diff((1, 2), (1, 2)))
self.assertEqual({}, diff({1, 2}, {1, 2}))
self.assertEqual({}, diff({'a': 1, 'b': 2}, {'a': 1, 'b': 2}))
self.assertEqual({}, diff([], []))
self.assertEqual({}, diff(None, None))
self.assertEqual({}, diff({}, {}))
self.assertEqual({}, diff(set(), set()))

self.assertEqual(2, diff(1, 2))
self.assertEqual(False, diff(True, False))
self.assertEqual('def', diff('abc', 'def'))
self.assertEqual([3, 4], diff([1, 2], [3, 4]))
self.assertEqual((3, 4), diff((1, 2), (3, 4)))
self.assertEqual({3, 4}, diff({1, 2}, {3, 4}))
self.assertEqual({replace: {'c': 3, 'd': 4}}, diff({'a': 1, 'b': 2}, {'c': 3, 'd': 4}))

self.assertEqual({replace: {'c': 3, 'd': 4}}, diff([1, 2], {'c': 3, 'd': 4}))
self.assertEqual(123, diff({'a': 1, 'b': 2}, 123))

self.assertEqual({delete: ['b']}, diff({'a': 1, 'b': 2}, {'a': 1}))
self.assertEqual({'b': 3}, diff({'a': 1, 'b': 2}, {'a': 1, 'b': 3}))
self.assertEqual({'c': 3}, diff({'a': 1, 'b': 2}, {'a': 1, 'b': 2, 'c': 3}))
self.assertEqual({delete: ['b'], 'c': 3}, diff({'a': 1, 'b': 2}, {'a': 1, 'c': 3}))

self.assertEqual({add: {3}}, diff({1, 2}, {1, 2, 3}))
self.assertEqual({add: {3}, discard: {4}}, diff({1, 2, 4}, {1, 2, 3}))
self.assertEqual({discard: {4}}, diff({1, 2, 4}, {1, 2}))

self.assertEqual({insert: [(1, 'b')]}, diff(['a', 'c'], ['a', 'b', 'c']))
self.assertEqual({insert: [(1, 'b')], delete: [3, 0]}, diff(['x', 'a', 'c', 'x'], ['a', 'b', 'c']))
self.assertEqual(
{insert: [(2, 'b')], delete: [4, 0], 1: {'v': 20}},
diff(['x', 'a', {'v': 11}, 'c', 'x'], ['a', {'v': 20}, 'b', 'c'])
)
self.assertEqual(
{insert: [(2, 'b')], delete: [4, 0], 1: {'v': 20}},
diff(['x', 'a', {'u': 10, 'v': 11}, 'c', 'x'], ['a', {'u': 10, 'v': 20}, 'b', 'c'])
)

def test_marshal(self):
differ = JsonDiffer()

d = {
delete: 3,
'$delete': 4,
insert: 4,
'$$something': 1
}

dm = differ.marshal(d)

self.assertEqual(d, differ.unmarshal(dm))

@given(strategies.randoms().map(generate_scenario_no_sets))
@settings(max_examples=1000)
def test_dump(self, scenario):
a, b = scenario
diff(a, b, syntax='compact', dump=True)
diff(a, b, syntax='explicit', dump=True)
diff(a, b, syntax='symmetric', dump=True)

@given(strategies.randoms().map(generate_scenario))
@settings(max_examples=1000)
def test_compact_syntax(self, scenario):
a, b = scenario
differ = JsonDiffer(syntax='compact')
d = differ.diff(a, b)
self.assertEqual(b, differ.patch(a, d))
dm = differ.marshal(d)
self.assertEqual(d, differ.unmarshal(dm))


@given(strategies.randoms().map(generate_scenario))
@settings(max_examples=1000)
def test_explicit_syntax(self, scenario):
a, b = scenario
differ = JsonDiffer(syntax='explicit')
d = differ.diff(a, b)
# self.assertEqual(b, differ.patch(a, d))
dm = differ.marshal(d)
self.assertEqual(d, differ.unmarshal(dm))

@given(strategies.randoms().map(generate_scenario))
@settings(max_examples=1000)
def test_symmetric_syntax(self, scenario):
a, b = scenario
differ = JsonDiffer(syntax='symmetric')
d = differ.diff(a, b)
self.assertEqual(b, differ.patch(a, d))
self.assertEqual(a, differ.unpatch(b, d))
dm = differ.marshal(d)
self.assertEqual(d, differ.unmarshal(dm))

def test_long_arrays(self):
size = 100
a = [{'a': i, 'b': 2 * i} for i in range(1, size)]
b = [{'a': i, 'b': 3 * i} for i in range(1, size)]
r = sys.getrecursionlimit()
sys.setrecursionlimit(size - 1)

try:
diff(a, b)
except RecursionError:
self.fail('cannot diff long arrays')
finally:
sys.setrecursionlimit(r)

0 comments on commit aa30b51

Please sign in to comment.