summaryrefslogtreecommitdiff
path: root/test/test_roundtrip.py
blob: f076e576ac71de0ff4d649deca72cd68054bdfcf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import pytest

import rdflib
import rdflib.compare

try:
    from .test_nt_suite import all_nt_files

    assert all_nt_files
    from .test_n3_suite import all_n3_files

    assert all_n3_files
except:
    from test.test_nt_suite import all_nt_files
    from test.test_n3_suite import all_n3_files

"""
Test round-tripping by all serializers/parser that are registerd.
This means, you may test more than just core rdflib!

run with no arguments to test all formats + all files
run with a single argument, to test only that format, i.e. "n3"
run with three arguments to test round-tripping in a given format
and reading a single file in the given format, i.e.:

python test/test_roundtrip.py xml nt test/nt/literals-02.nt

tests roundtripping through rdf/xml with only the literals-02 file

"""


SKIP = [
    (
        "xml",
        "test/n3/n3-writer-test-29.n3",
    ),  # has predicates that cannot be shortened to strict qnames
    ("xml", "test/nt/qname-02.nt"),  # uses a property that cannot be qname'd
    ("trix", "test/n3/strquot.n3"),  # contains charachters forbidden by the xml spec
    ("xml", "test/n3/strquot.n3"),  # contains charachters forbidden by the xml spec
    ("json-ld", "test/nt/keywords-04.nt"),  # known NT->JSONLD problem
    ("json-ld", "test/n3/example-misc.n3"),  # known N3->JSONLD problem
    ("json-ld", "test/n3/n3-writer-test-16.n3"),  # known N3->JSONLD problem
    ("json-ld", "test/n3/rdf-test-11.n3"),  # known N3->JSONLD problem
    ("json-ld", "test/n3/rdf-test-28.n3"),  # known N3->JSONLD problem
    ("json-ld", "test/n3/n3-writer-test-26.n3"),  # known N3->JSONLD problem
    ("json-ld", "test/n3/n3-writer-test-28.n3"),  # known N3->JSONLD problem
    ("json-ld", "test/n3/n3-writer-test-22.n3"),  # known N3->JSONLD problem
    ("json-ld", "test/n3/rdf-test-21.n3"),  # known N3->JSONLD problem
]


def roundtrip(e, verbose=False):
    infmt, testfmt, source = e

    g1 = rdflib.ConjunctiveGraph()

    g1.parse(source, format=infmt)

    s = g1.serialize(format=testfmt)

    if verbose:
        print("S:")
        print(s, flush=True)

    g2 = rdflib.ConjunctiveGraph()
    g2.parse(data=s, format=testfmt)

    if verbose:
        both, first, second = rdflib.compare.graph_diff(g1, g2)
        print("Diff:")
        print("%d triples in both" % len(both))
        print("G1 Only:")
        for t in sorted(first):
            print(t)

        print("--------------------")
        print("G2 Only")
        for t in sorted(second):
            print(t)

    assert rdflib.compare.isomorphic(g1, g2)

    if verbose:
        print("Ok!")


formats = None


def get_cases():
    global formats
    if not formats:
        serializers = set(
            x.name for x in rdflib.plugin.plugins(None, rdflib.plugin.Serializer)
        )
        parsers = set(x.name for x in rdflib.plugin.plugins(None, rdflib.plugin.Parser))
        formats = parsers.intersection(serializers)

    for testfmt in formats:
        if "/" in testfmt:
            continue  # skip double testing
        for f, infmt in all_nt_files():
            if (testfmt, f) not in SKIP:
                yield roundtrip, (infmt, testfmt, f)


@pytest.mark.parametrize("checker, args", get_cases())
def test_cases(checker, args):
    checker(args)


def get_n3_test():
    global formats
    if not formats:
        serializers = set(
            x.name for x in rdflib.plugin.plugins(None, rdflib.plugin.Serializer)
        )
        parsers = set(x.name for x in rdflib.plugin.plugins(None, rdflib.plugin.Parser))
        formats = parsers.intersection(serializers)

    for testfmt in formats:
        if "/" in testfmt:
            continue  # skip double testing
        for f, infmt in all_n3_files():
            if (testfmt, f) not in SKIP:
                yield roundtrip, (infmt, testfmt, f)


@pytest.mark.parametrize("checker, args", get_n3_test())
def test_n3(checker, args):
    checker(args)