Skip to content

Commit

Permalink
Fix some bnodes being skipped inside list containers
Browse files Browse the repository at this point in the history
  • Loading branch information
rubensworks committed Oct 14, 2020
1 parent 471b42e commit 830da21
Show file tree
Hide file tree
Showing 2 changed files with 148 additions and 0 deletions.
1 change: 1 addition & 0 deletions lib/entryhandler/EntryHandlerArrayValue.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ export class EntryHandlerArrayValue implements IEntryHandler<boolean> {
if ('@list' in Util.getContextValueContainer(parentContext, parentKey)) {
// Our value is part of an array
// Emit the given objects as list elements
parsingContext.emittedStack[depth + 1] = true; // Ensure the creation of bnodes for empty nodes
const values = await util.valueToTerm(await parsingContext.getContext(keys), parentKey, value, depth, keys);

for (const object of values) {
Expand Down
147 changes: 147 additions & 0 deletions test/JsonLdParser-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3086,6 +3086,153 @@ describe('JsonLdParser', () => {
DF.quad(DF.namedNode('ex:id'), DF.namedNode('http://example.com/foo'), DF.blankNode('l1.1')),
]);
});

it('with an inner predicate with array with one element', async () => {
const stream = streamifyString(`
{
"@context": {"foo": {"@id": "http://example.com/foo", "@container": "@list"}},
"@id": "ex:id",
"foo": [{
"ex:p": ["a"]
}]
}`);
const output = await arrayifyStream(stream.pipe(parser));
return expect(output).toBeRdfIsomorphic([
DF.quad(DF.blankNode('b0'), DF.namedNode('ex:p'), DF.literal('a')),

DF.quad(DF.blankNode('l0'), DF.namedNode(Util.RDF + 'first'), DF.blankNode('b0')),
DF.quad(DF.blankNode('l0'), DF.namedNode(Util.RDF + 'rest'), DF.namedNode(Util.RDF + 'nil')),

DF.quad(DF.namedNode('ex:id'), DF.namedNode('http://example.com/foo'), DF.blankNode('l0')),
]);
});

it('with an inner predicate with array with zero elements', async () => {
const stream = streamifyString(`
{
"@context": {"foo": {"@id": "http://example.com/foo", "@container": "@list"}},
"@id": "ex:id",
"foo": [{
"ex:p": []
}]
}`);
const output = await arrayifyStream(stream.pipe(parser));
return expect(output).toBeRdfIsomorphic([
DF.quad(DF.blankNode('l0'), DF.namedNode(Util.RDF + 'first'), DF.blankNode('b0')),
DF.quad(DF.blankNode('l0'), DF.namedNode(Util.RDF + 'rest'), DF.namedNode(Util.RDF + 'nil')),

DF.quad(DF.namedNode('ex:id'), DF.namedNode('http://example.com/foo'), DF.blankNode('l0')),
]);
});

it('with an empty inner node', async () => {
const stream = streamifyString(`
{
"@context": {"foo": {"@id": "http://example.com/foo", "@container": "@list"}},
"@id": "ex:id",
"foo": [{}]
}`);
const output = await arrayifyStream(stream.pipe(parser));
return expect(output).toBeRdfIsomorphic([
DF.quad(DF.blankNode('l0'), DF.namedNode(Util.RDF + 'first'), DF.blankNode('b0')),
DF.quad(DF.blankNode('l0'), DF.namedNode(Util.RDF + 'rest'), DF.namedNode(Util.RDF + 'nil')),

DF.quad(DF.namedNode('ex:id'), DF.namedNode('http://example.com/foo'), DF.blankNode('l0')),
]);
});

it('without inner node', async () => {
const stream = streamifyString(`
{
"@context": {"foo": {"@id": "http://example.com/foo", "@container": "@list"}},
"@id": "ex:id",
"foo": []
}`);
const output = await arrayifyStream(stream.pipe(parser));
return expect(output).toBeRdfIsomorphic([
DF.quad(DF.namedNode('ex:id'), DF.namedNode('http://example.com/foo'), DF.namedNode(Util.RDF + 'nil')),
]);
});
});

describe('a list container inside a node', () => {
it('with one inner element', async () => {
const stream = streamifyString(`
{
"@context": {"foo": {"@id": "http://example.com/foo", "@container": "@list"}},
"@id": "ex:id",
"ex:p": {
"foo": ["baz"]
}
}`);
const output = await arrayifyStream(stream.pipe(parser));
return expect(output).toBeRdfIsomorphic([
DF.quad(DF.blankNode('l0'), DF.namedNode(Util.RDF + 'first'), DF.literal('baz')),
DF.quad(DF.blankNode('l0'), DF.namedNode(Util.RDF + 'rest'), DF.namedNode(Util.RDF + 'nil')),

DF.quad(DF.blankNode('b0'), DF.namedNode('http://example.com/foo'), DF.blankNode('l0')),

DF.quad(DF.namedNode('ex:id'), DF.namedNode('ex:p'), DF.blankNode('b0')),
]);
});

it('with zero inner elements', async () => {
const stream = streamifyString(`
{
"@context": {"foo": {"@id": "http://example.com/foo", "@container": "@list"}},
"@id": "ex:id",
"ex:p": {
"foo": []
}
}`);
const output = await arrayifyStream(stream.pipe(parser));
return expect(output).toBeRdfIsomorphic([
DF.quad(DF.blankNode('b0'), DF.namedNode('http://example.com/foo'), DF.namedNode(Util.RDF + 'nil')),

DF.quad(DF.namedNode('ex:id'), DF.namedNode('ex:p'), DF.blankNode('b0')),
]);
});
});

describe('a list container inside a normal array', () => {
it('with one inner element', async () => {
const stream = streamifyString(`
{
"@context": {"foo": {"@id": "http://example.com/foo", "@container": "@list"}},
"@id": "ex:id",
"ex:p": [
{
"foo": ["baz"]
}
]
}`);
const output = await arrayifyStream(stream.pipe(parser));
return expect(output).toBeRdfIsomorphic([
DF.quad(DF.blankNode('l0'), DF.namedNode(Util.RDF + 'first'), DF.literal('baz')),
DF.quad(DF.blankNode('l0'), DF.namedNode(Util.RDF + 'rest'), DF.namedNode(Util.RDF + 'nil')),

DF.quad(DF.blankNode('b0'), DF.namedNode('http://example.com/foo'), DF.blankNode('l0')),

DF.quad(DF.namedNode('ex:id'), DF.namedNode('ex:p'), DF.blankNode('b0')),
]);
});

it('with zero inner elements', async () => {
const stream = streamifyString(`
{
"@context": {"foo": {"@id": "http://example.com/foo", "@container": "@list"}},
"@id": "ex:id",
"ex:p": [{
"foo": []
}]
}`);
const output = await arrayifyStream(stream.pipe(parser));
return expect(output).toBeRdfIsomorphic([
DF.quad(DF.blankNode('b0'), DF.namedNode('http://example.com/foo'), DF.namedNode(Util.RDF + 'nil')),

DF.quad(DF.namedNode('ex:id'), DF.namedNode('ex:p'), DF.blankNode('b0')),
]);
});
});

});
Expand Down

0 comments on commit 830da21

Please sign in to comment.