Skip to content
Snippets Groups Projects
parse_test.go 5.11 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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)
    		}
    	}
    }