/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.jena.riot.system;

import org.apache.jena.graph.Node ;
import org.apache.jena.riot.ErrorHandlerTestLib ;
import org.apache.jena.riot.ErrorHandlerTestLib.ExError ;
import org.apache.jena.riot.ErrorHandlerTestLib.ExWarning ;
import org.apache.jena.shared.impl.JenaParameters ;
import org.apache.jena.sparql.util.NodeFactoryExtra ;
import org.junit.After ;
import org.junit.Before ;
import org.junit.Test ;

/** Tests for node Checker */
public class TestChecker
{
    private boolean b ;

    @Before
    public void before() {
        b = JenaParameters.enableWhitespaceCheckingOfTypedLiterals ;
        // The default is false which allows whitespace around integers.
        // Jena seems to allow white space around dateTimes either way.
        // JenaParameters.enableWhitespaceCheckingOfTypedLiterals = true ;
    }

    @After
    public void after() {
        JenaParameters.enableWhitespaceCheckingOfTypedLiterals = b;
    }

    @Test
    public void checker_uri_01()    { check("<http://example/x>") ; }

    @Test(expected=ExError.class)
    public void checker_uri_02()    { check("<x>") ; }

    @Test (expected=ExWarning.class)
    public void checker_uri_03()    { check("<urn:abc>") ; }

    @Test (expected=ExWarning.class)
    public void checker_uri_04()    { check("<urn:x:bc>") ; }

    @Test
    public void checker_uri_05()    { check("<urn:abc:y>") ; }

    @Test (expected=ExWarning.class)
    public void checker_uri_06()    { check("<URN:abc:y>") ; }

    @Test (expected=ExWarning.class)
    public void checker_uri_07()    { check("<http://example:80/>") ; }

    @Test
    public void checker01()         { check("''") ; }

    @Test
    public void checker02()         { check("''@en") ; }

    @Test (expected=ExWarning.class)
    public void checker10()         { check("''^^xsd:dateTime") ; }

    // Whitespace facet processing.
    // Strictly illegal RDF but Jena accepts them.
    // See JenaParameters.enableWhitespaceCheckingOfTypedLiterals

    @Test
    public void checker11()         { check("'  2010-05-19T01:01:01.01+01:00'^^xsd:dateTime") ; }

    @Test
    public void checker12()         { check("'\\n2010-05-19T01:01:01.01+01:00\\t\\r  '^^xsd:dateTime") ; }

    @Test
    public void checker13()         { check("' 123'^^xsd:integer") ; }

    // Internal white space - illegal
    @Test (expected=ExWarning.class)
    public void checker14()     { check("'12 3'^^xsd:integer") ; }

    @Test
    public void checker15()     { check("'\\n123'^^xsd:integer") ; }

    // Test all the data type hierarchies that whitespace foo affects.
    @Test
    public void checker16()     { check("'123.0  '^^xsd:float") ; }

    @Test
    public void checker17()     { check("'123.0\\n'^^xsd:double") ; }

    @Test(expected=ExWarning.class)
    public void checker18()     { check("'\\b123.0\\n'^^xsd:double") ; }

    // Other bad lexical forms.
    @Test(expected=ExWarning.class)
    public void checker20()     { check("'XYZ'^^xsd:integer") ; }

    // Lang tag
    @Test(expected=ExWarning.class)
    public void checker21()     { check("'XYZ'@abcdefghijklmn") ; }


    @Test(expected=ExWarning.class)
    public void checker30()     { check("<http://base/[]iri>") ; }

    // XML Literals.

    @Test
    public void checker40()     { check("\"<x></x>\"^^rdf:XMLLiteral") ; }

    @Test(expected=ExWarning.class)
    // Unmatched tag
    public void checker41()     { check("\"<x>\"^^rdf:XMLLiteral") ; }

    @Test(expected=ExWarning.class)
    // Bad tagging.
    public void checker42()     { check("\"<x><y></x></y>\"^^rdf:XMLLiteral") ; }

    @Test(expected=ExWarning.class)
    // Not exclusive canonicalization
    public void checker43()     { check("\"<x/>\"^^rdf:XMLLiteral") ; }

    @Test
    public void checker44()     { check("'''<x xmlns=\"http://example/ns#\" attr=\"foo\"></x>'''^^rdf:XMLLiteral" ) ; }

    @Test(expected=ExWarning.class)
    // Exclusive canonicalization requires namespace declaration before attributes
    public void checker45()     { check("'''<x attr=\"foo\" xmlns=\"http://example/ns#\"></x>'''^^rdf:XMLLiteral") ; }

    private static ErrorHandler errorHandler = new ErrorHandlerTestLib.ErrorHandlerEx();

    private static void check(String string)
    {
        Node n = NodeFactoryExtra.parseNode(string) ;
        Checker.check(n, errorHandler, -1, -1);
    }
}
