Skip to content
Snippets Groups Projects
parse_test.go 5.11 KiB
Newer Older
Manish R Jain's avatar
Manish R Jain committed
/*
 * Copyright 2015 DGraph Labs, Inc.
Manish R Jain's avatar
Manish R Jain committed
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * 		http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package rdf

import (
	"reflect"
	"testing"
)

var testNQuads = []struct {
	input  string
	nq     NQuad
	hasErr bool
}{
	{
		input: `<some_subject_id> <predicate> <object_id> .`,
		nq: NQuad{
			Subject:     "some_subject_id",
			Predicate:   "predicate",
			ObjectId:    "object_id",
			ObjectValue: nil,
		},
	},
	{
		input: `_:alice <predicate> <object_id> .`,
		nq: NQuad{
			Subject:     "_:alice",
			Predicate:   "predicate",
			ObjectId:    "object_id",
			ObjectValue: nil,
		},
	},
	{
		input: `_uid_:0x01 <predicate> <object_id> .`,
		nq: NQuad{
			Subject:     "_uid_:0x01",
			Predicate:   "predicate",
			ObjectId:    "object_id",
			ObjectValue: nil,
		},
	},
	{
		input: `<some_subject_id> <predicate> _uid_:0x01 .`,
		nq: NQuad{
			Subject:     "some_subject_id",
			Predicate:   "predicate",
			ObjectId:    "_uid_:0x01",
			ObjectValue: nil,
		},
	},
	{
		input: `_uid_:0x01 <predicate> _uid_:0x02 .`,
		nq: NQuad{
			Subject:     "_uid_:0x01",
			Predicate:   "predicate",
			ObjectId:    "_uid_:0x02",
			ObjectValue: nil,
		},
	},
Manish R Jain's avatar
Manish R Jain committed
	{
		input: `_:alice <follows> _:bob0 .`,
		nq: NQuad{
			Subject:     "_:alice",
			Predicate:   "follows",
			ObjectId:    "_:bob0",
			ObjectValue: nil,
		},
	},
	{
		input: `_:alice <name> "Alice In Wonderland" .`,
		nq: NQuad{
			Subject:     "_:alice",
			Predicate:   "name",
			ObjectId:    "",
			ObjectValue: "Alice In Wonderland",
		},
	},
	{
		input: `_:alice <name> "Alice In Wonderland"@en-0 .`,
		nq: NQuad{
			Subject:     "_:alice",
Manish R Jain's avatar
Manish R Jain committed
			ObjectId:    "",
			ObjectValue: "Alice In Wonderland",
		},
	},
	{
		input: `_:alice <age> "013"^^<integer> .`,
		nq: NQuad{
			Subject:     "_:alice",
			Predicate:   "age",
			ObjectId:    "",
			ObjectValue: "013@@integer",
		},
	},
	{
		input: `<http://www.w3.org/2001/sw/RDFCore/nedges/> <http://purl.org/dc/terms/title> "N-Edges"@en-US .`,
Manish R Jain's avatar
Manish R Jain committed
		nq: NQuad{
			Subject:     "http://www.w3.org/2001/sw/RDFCore/nedges/",
			Predicate:   "http://purl.org/dc/terms/title.en-US",
Manish R Jain's avatar
Manish R Jain committed
			ObjectId:    "",
			ObjectValue: "N-Edges",
Manish R Jain's avatar
Manish R Jain committed
		},
	},
	{
		input: `_:art <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://xmlns.com/foaf/0.1/Person> .`,
		nq: NQuad{
			Subject:     "_:art",
			Predicate:   "http://www.w3.org/1999/02/22-rdf-syntax-ns#type",
			ObjectId:    "http://xmlns.com/foaf/0.1/Person",
			ObjectValue: nil,
		},
	},
Manish R Jain's avatar
Manish R Jain committed
	{
		input:  "_:alice .",
		hasErr: true,
	},
	{
		input:  "_:alice knows .",
		hasErr: true,
	},
	{
		input:  "_uid_: 0x01 <knows> <something> .",
		hasErr: true,
	},
	{
		input:  "<alice> <knows> _uid_: 0x01 .",
		hasErr: true,
Manish R Jain's avatar
Manish R Jain committed
	},
	{
		input:  `_:alice "knows" stuff .`,
		hasErr: true,
	},
	{
		input:  "_:alice <knows> stuff .",
		hasErr: true,
	},
	{
		input:  "_:alice <knows> <stuff>",
		hasErr: true,
	},
	{
		input:  `"_:alice" <knows> <stuff> .`,
		hasErr: true,
	},
	{
		input:  `_:alice <knows> "stuff .`,
		hasErr: true,
	},
	{
		input:  `_:alice <knows> "stuff"@-en .`,
		hasErr: true,
	},
	{
		input:  `_:alice <knows> "stuff"^<string> .`,
		hasErr: true,
	},
	{
		input:  `_:alice <knows> "stuff"^^xs:string .`,
		hasErr: true,
	},
	{
		input: `_:alice <knows> "stuff"^^<xs:string> .`,
		nq: NQuad{
			Subject:     "_:alice",
			Predicate:   "knows",
			ObjectId:    "",
			ObjectValue: "stuff@@xs:string",
		},
		hasErr: false,
	},
	{
		input: `_:alice <knows> "stuff"^^<xs:string> <label> .`,
		nq: NQuad{
			Subject:     "_:alice",
			Predicate:   "knows",
			ObjectId:    "",
			ObjectValue: "stuff@@xs:string",
			Label:       "label",
		},
		hasErr: false,
	},
	{
		input: `_:alice <knows> "stuff"^^<xs:string> _:label .`,
		nq: NQuad{
			Subject:     "_:alice",
			Predicate:   "knows",
			ObjectId:    "",
			ObjectValue: "stuff@@xs:string",
			Label:       "_:label",
		},
		hasErr: false,
	},
	{
		input:  `_:alice <knows> "stuff"^^<xs:string> "label" .`,
		hasErr: true,
	},
	{
		input: `_:alice <knows> <bob> . <bob>`, // ignores the <bob> after dot.
		nq: NQuad{
			Subject:   "_:alice",
			Predicate: "knows",
			ObjectId:  "bob",
		},
	},
	{
		input: `_:alice <likes> "mov\"enpick" .`, // ignores the <bob> after dot.
		nq: NQuad{
			Subject:     "_:alice",
			Predicate:   "likes",
			ObjectValue: `mov\"enpick`,
		},
	},
Manish R Jain's avatar
Manish R Jain committed
}

func TestLex(t *testing.T) {
	for _, test := range testNQuads {
		rnq, err := Parse(test.input)
		if test.hasErr {
			if err == nil {
Manish R Jain's avatar
Manish R Jain committed
				t.Errorf("Expected error for input: %q. Output: %+v", test.input, rnq)
			}
			continue
		} else {
			if err != nil {
				t.Errorf("Unexpected error: %v", err)
Manish R Jain's avatar
Manish R Jain committed
			}
		}
Manish R Jain's avatar
Manish R Jain committed
		if !reflect.DeepEqual(rnq, test.nq) {
			t.Errorf("Expected %v. Got: %v", test.nq, rnq)
		}
	}
}