mirror of
https://github.com/gsi-upm/sitc
synced 2025-12-15 09:38:16 +00:00
Modify RDF exercises
This commit is contained in:
93
rdf/tests.py
Normal file
93
rdf/tests.py
Normal file
@@ -0,0 +1,93 @@
|
||||
import operator
|
||||
import types
|
||||
import sys
|
||||
from rdflib import term, RDF, Namespace
|
||||
|
||||
schema = Namespace('http://schema.org/')
|
||||
|
||||
|
||||
def test(description, got, expected=None, func=None):
|
||||
if isinstance(got, types.GeneratorType):
|
||||
got = set(got)
|
||||
try:
|
||||
if expected is None:
|
||||
func = func or operator.truth
|
||||
expected = True
|
||||
assert func(got)
|
||||
else:
|
||||
func = func or operator.eq
|
||||
assert func(got, expected)
|
||||
except AssertionError:
|
||||
print('Test failed: {}'.format(description), file=sys.stderr)
|
||||
print('\tExpected: {}'.format(expected), file=sys.stderr)
|
||||
print('\tGot: {}'.format(got), file=sys.stderr)
|
||||
raise Exception('Test failed: {}'.format(description))
|
||||
|
||||
|
||||
def atLeast(lst, number):
|
||||
return len(set(lst))>=number
|
||||
|
||||
|
||||
def containsAll(lst, other):
|
||||
for i in other:
|
||||
if i not in lst:
|
||||
print('{} not found'.format(i), file=sys.stderr)
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def test_hotel(g):
|
||||
test('Some triples are loaded',
|
||||
len(g))
|
||||
|
||||
hotels = set(g.subjects(RDF.type, schema['Hotel']))
|
||||
test('At least 2 hotels are loaded',
|
||||
hotels,
|
||||
2,
|
||||
atLeast)
|
||||
|
||||
for hotel in hotels:
|
||||
if 'GSIHOTEL' in hotel: # Do not check the example hotel
|
||||
continue
|
||||
props = g.predicates(hotel)
|
||||
test('Each hotel has all required properties',
|
||||
props,
|
||||
list(schema[i] for i in ['description', 'email', 'logo', 'priceRange']),
|
||||
func=containsAll)
|
||||
|
||||
reviews = set(g.subjects(RDF.type, schema['Review']))
|
||||
test('At least 3 reviews are loaded',
|
||||
reviews,
|
||||
3,
|
||||
atLeast)
|
||||
|
||||
for review in reviews:
|
||||
props = g.predicates(review)
|
||||
test('Each review has all required properties',
|
||||
props,
|
||||
list(schema[i] for i in ['itemReviewed', 'reviewBody', 'reviewRating']),
|
||||
func=containsAll)
|
||||
ratings = list(g.objects(review, schema['reviewRating']))
|
||||
for rating in ratings:
|
||||
value = g.value(rating, schema['ratingValue'])
|
||||
test('The review should have ratings', value)
|
||||
|
||||
authors = set(g.objects(None, schema['author']))
|
||||
for author in authors:
|
||||
for prop in g.predicates(author, None):
|
||||
if 'name' in str(prop).lower():
|
||||
break
|
||||
else:
|
||||
assert "At least a reviewer has a name (surname, givenName...)"
|
||||
|
||||
print('All tests passed. Congratulations!')
|
||||
print()
|
||||
print('Now you can try to add the optional properties')
|
||||
|
||||
|
||||
def test_example(g):
|
||||
test('Some triples have been loaded',
|
||||
len(g))
|
||||
test('A person has been defined',
|
||||
g.subjects(RDF.type, term.URIRef('http://xmlns.com/foaf/0.1/Person')))
|
||||
print('All tests passed. Well done!')
|
||||
Reference in New Issue
Block a user