/*
 * 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.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=ExWarning.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);
    }
}
