/*
 * 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.olingo.server.core.uri.antlr;

import org.antlr.v4.runtime.Lexer;
import org.apache.olingo.server.core.uri.testutil.TokenValidator;
import org.junit.Test;

public class TestLexer {

  private TokenValidator test = null;

  private static final String cPCT_ENCODED = "%45%46%47" + "%22" + "%5C";// last two chars are not in
                                                                         // cPCT_ENCODED_UNESCAPED
  private static final String cUNRESERVED = "ABCabc123-._~";
  private static final String cOTHER_DELIMS = "!()*+,;";
  private static final String cSUB_DELIMS = "$&'=" + cOTHER_DELIMS;

  private static final String cPCHAR = cUNRESERVED + cPCT_ENCODED + cSUB_DELIMS + ":@";

  public TestLexer() {
    test = new TokenValidator();
  }

  @Test
  public void test() {

    // test.log(1).run("ESAllPrim?$orderby=PropertyDouble eq 3.5E+38");
  }

  // ;------------------------------------------------------------------------------
  // ; 0. URI
  // ;------------------------------------------------------------------------------

  @Test
  public void testUnary() {
    test.run("- a eq a").isAllInput();
  }

  @Test
  public void testUriTokens() {
    test.globalMode(UriLexer.MODE_QUERY);
    test.run("#").isText("#").isType(UriLexer.FRAGMENT);
    test.run("$count").isText("$count").isType(UriLexer.COUNT);
    test.run("$ref").isText("$ref").isType(UriLexer.REF);
    test.run("$value").isText("$value").isType(UriLexer.VALUE);
  }

  // ;------------------------------------------------------------------------------
  // ; 2. Query Options
  // ;------------------------------------------------------------------------------
  @Test
  public void testQueryOptionsTokens() {

    test.globalMode(UriLexer.MODE_QUERY);
    test.run("$skip=1").isAllText("$skip=1").isType(UriLexer.SKIP);
    test.run("$skip=2").isAllText("$skip=2").isType(UriLexer.SKIP);
    test.run("$skip=123").isAllText("$skip=123").isType(UriLexer.SKIP);

    test.run("$top=1").isAllText("$top=1").isType(UriLexer.TOP);
    test.run("$top=2").isAllText("$top=2").isType(UriLexer.TOP);
    test.run("$top=123").isAllText("$top=123").isType(UriLexer.TOP);

    test.run("$levels=1").isAllText("$levels=1").isType(UriLexer.LEVELS);
    test.run("$levels=2").isAllText("$levels=2").isType(UriLexer.LEVELS);
    test.run("$levels=123").isAllText("$levels=123").isType(UriLexer.LEVELS);
    test.run("$levels=max").isAllText("$levels=max").isType(UriLexer.LEVELS);

    test.run("$format=atom").isAllText("$format=atom").isType(UriLexer.FORMAT);
    test.run("$format=json").isAllText("$format=json").isType(UriLexer.FORMAT);
    test.run("$format=xml").isAllText("$format=xml").isType(UriLexer.FORMAT);
    test.run("$format=abc/def").isAllText("$format=abc/def").isType(UriLexer.FORMAT);

    test.run("$id=123").isAllText("$id=123").isType(UriLexer.ID);
    test.run("$id=ABC").isAllText("$id=ABC").isType(UriLexer.ID);

    test.run("$skiptoken=ABC").isAllText("$skiptoken=ABC").isType(UriLexer.SKIPTOKEN);
    test.run("$skiptoken=ABC").isAllText("$skiptoken=ABC").isType(UriLexer.SKIPTOKEN);

    test.run("$search=\"ABC\"").isAllText("$search=\"ABC\"").isType(UriLexer.SEARCH);
    test.run("$search=ABC").isAllText("$search=ABC").isType(UriLexer.SEARCH);
    test.run("$search=\"A%20B%20C\"").isAllText("$search=\"A%20B%20C\"").isType(UriLexer.SEARCH);
  }

  // ;------------------------------------------------------------------------------
  // ; 4. Expressions
  // ;------------------------------------------------------------------------------
  @Test
  public void testQueryExpressions() {
    test.globalMode(Lexer.DEFAULT_MODE);

    test.run("$it").isText("$it").isType(UriLexer.IT);

    test.run("$filter=contains(").at(2).isText("contains(").isType(UriLexer.CONTAINS_WORD);

    test.run("$filter=containsabc").at(2).isText("containsabc")
        .isType(UriLexer.ODATAIDENTIFIER); // test that this is a ODI

    test.run("$filter=startswith(").at(2).isText("startswith(").isType(UriLexer.STARTSWITH_WORD);
    test.run("$filter=endswith(").at(2).isText("endswith(").isType(UriLexer.ENDSWITH_WORD);
    test.run("$filter=length(").at(2).isText("length(").isType(UriLexer.LENGTH_WORD);
    test.run("$filter=indexof(").at(2).isText("indexof(").isType(UriLexer.INDEXOF_WORD);
    test.run("$filter=substring(").at(2).isText("substring(").isType(UriLexer.SUBSTRING_WORD);
    test.run("$filter=tolower(").at(2).isText("tolower(").isType(UriLexer.TOLOWER_WORD);
    test.run("$filter=toupper(").at(2).isText("toupper(").isType(UriLexer.TOUPPER_WORD);
    test.run("$filter=trim(").at(2).isText("trim(").isType(UriLexer.TRIM_WORD);
    test.run("$filter=concat(").at(2).isText("concat(").isType(UriLexer.CONCAT_WORD);

  }

  // ;------------------------------------------------------------------------------
  // ; 7. Literal Data Values
  // ;------------------------------------------------------------------------------

  @Test
  public void testLiteralDataValues() {
    test.globalMode(Lexer.DEFAULT_MODE);
    // null
    test.run("null").isInput().isType(UriLexer.NULLVALUE);

    // binary
    test.run("binary'ABCD'").isInput().isType(UriLexer.BINARY);
    test.run("BiNaRy'ABCD'").isInput().isType(UriLexer.BINARY);

    // boolean
    test.run("true").isInput().isType(UriLexer.TRUE);
    test.run("false").isInput().isType(UriLexer.FALSE);
    test.run("TrUe").isInput().isType(UriLexer.BOOLEAN);
    test.run("FaLsE").isInput().isType(UriLexer.BOOLEAN);

    // Lexer rule INT
    test.run("123").isInput().isType(UriLexer.INT);
    test.run("123456789").isInput().isType(UriLexer.INT);
    test.run("+123").isInput().isType(UriLexer.INT);
    test.run("+123456789").isInput().isType(UriLexer.INT);
    test.run("-123").isInput().isType(UriLexer.INT);
    test.run("-123456789").isInput().isType(UriLexer.INT);

    // Lexer rule DECIMAL
    test.run("0.1").isInput().isType(UriLexer.DECIMAL);
    test.run("1.1").isInput().isType(UriLexer.DECIMAL);
    test.run("+0.1").isInput().isType(UriLexer.DECIMAL);
    test.run("+1.1").isInput().isType(UriLexer.DECIMAL);
    test.run("-0.1").isInput().isType(UriLexer.DECIMAL);
    test.run("-1.1").isInput().isType(UriLexer.DECIMAL);

    // Lexer rule EXP
    test.run("1.1e+1").isInput().isType(UriLexer.DECIMAL);
    test.run("1.1e-1").isInput().isType(UriLexer.DECIMAL);

    test.run("NaN").isInput().isType(UriLexer.NANINFINITY);
    test.run("-INF").isInput().isType(UriLexer.NANINFINITY);
    test.run("INF").isInput().isType(UriLexer.NANINFINITY);

    // Lexer rule GUID
    test.run("1234ABCD-12AB-23CD-45EF-123456780ABC").isInput().isType(UriLexer.GUID);
    test.run("1234ABCD-12AB-23CD-45EF-123456780ABC").isInput().isType(UriLexer.GUID);

    // Lexer rule DATE
    test.run("2013-11-15").isInput().isType(UriLexer.DATE);

    // Lexer rule DATETIMEOFFSET
    test.run("2013-11-15T13:35Z").isInput().isType(UriLexer.DATETIMEOFFSET);
    test.run("2013-11-15T13:35:10Z").isInput().isType(UriLexer.DATETIMEOFFSET);
    test.run("2013-11-15T13:35:10.1234Z").isInput().isType(UriLexer.DATETIMEOFFSET);

    test.run("2013-11-15T13:35:10.1234+01:30").isInput().isType(UriLexer.DATETIMEOFFSET);
    test.run("2013-11-15T13:35:10.1234-01:12").isInput().isType(UriLexer.DATETIMEOFFSET);

    test.run("2013-11-15T13:35Z").isInput().isType(UriLexer.DATETIMEOFFSET);

    // Lexer rule DURATION
    test.run("duration'PT67S'").isInput().isType(UriLexer.DURATION);
    test.run("duration'PT67.89S'").isInput().isType(UriLexer.DURATION);

    test.run("duration'PT5M'").isInput().isType(UriLexer.DURATION);
    test.run("duration'PT5M67S'").isInput().isType(UriLexer.DURATION);
    test.run("duration'PT5M67.89S'").isInput().isType(UriLexer.DURATION);

    test.run("duration'PT4H'").isInput().isType(UriLexer.DURATION);
    test.run("duration'PT4H67S'").isInput().isType(UriLexer.DURATION);
    test.run("duration'PT4H67.89S'").isInput().isType(UriLexer.DURATION);
    test.run("duration'PT4H5M'").isInput().isType(UriLexer.DURATION);
    test.run("duration'PT4H5M67S'").isInput().isType(UriLexer.DURATION);
    test.run("duration'PT4H5M67.89S'").isInput().isType(UriLexer.DURATION);

    test.run("duration'P3D'");
    test.run("duration'P3DT67S'").isInput().isType(UriLexer.DURATION);
    test.run("duration'P3DT67.89S'").isInput().isType(UriLexer.DURATION);
    test.run("duration'P3DT5M'").isInput().isType(UriLexer.DURATION);
    test.run("duration'P3DT5M67S'").isInput().isType(UriLexer.DURATION);
    test.run("duration'P3DT5M67.89S'").isInput().isType(UriLexer.DURATION);
    test.run("duration'P3DT4H'").isInput().isType(UriLexer.DURATION);
    test.run("duration'P3DT4H67S'").isInput().isType(UriLexer.DURATION);
    test.run("duration'P3DT4H67.89S'").isInput().isType(UriLexer.DURATION);
    test.run("duration'P3DT4H5M'").isInput().isType(UriLexer.DURATION);
    test.run("duration'P3DT4H5M67S'").isInput().isType(UriLexer.DURATION);
    test.run("duration'P3DT4H5M67.89S'").isInput().isType(UriLexer.DURATION);

    test.run("DuRaTiOn'P3DT4H5M67.89S'").isInput().isType(UriLexer.DURATION);
    test.run("DuRaTiOn'-P3DT4H5M67.89S'").isInput().isType(UriLexer.DURATION);

    test.run("20:00").isInput().isType(UriLexer.TIMEOFDAY);
    test.run("20:15:01").isInput().isType(UriLexer.TIMEOFDAY);
    test.run("20:15:01.02").isInput().isType(UriLexer.TIMEOFDAY);

    test.run("20:15:01.02").isInput().isType(UriLexer.TIMEOFDAY);

    // String
    test.run("'ABC'").isText("'ABC'").isType(UriLexer.STRING);
    test.run("'A%20C'").isInput().isType(UriLexer.STRING);
    test.run("'%20%20%20ABC'").isInput().isType(UriLexer.STRING);

  }

  @Test
  public void testDelims() {
    String reserved = "/";
    test.globalMode(UriLexer.MODE_QUERY);
    // Test lexer rule UNRESERVED
    test.run("$format=A/" + cUNRESERVED).isAllInput().isType(UriLexer.FORMAT);
    test.run("$format=A/" + cUNRESERVED + reserved).isType(UriLexer.FORMAT).at(4).isText(cUNRESERVED);
    // Test lexer rule PCT_ENCODED
    test.run("$format=A/" + cPCT_ENCODED).isAllInput().isType(UriLexer.FORMAT);
    test.run("$format=A/" + cPCT_ENCODED + reserved).isType(UriLexer.FORMAT).at(4).isText(cPCT_ENCODED);
    // Test lexer rule SUB_DELIMS
    test.run("$format=A/" + cSUB_DELIMS).isAllInput().isType(UriLexer.FORMAT);
    test.run("$format=A/" + cSUB_DELIMS + reserved).isType(UriLexer.FORMAT).at(4).isText("$");
    // Test lexer rule PCHAR rest
    test.run("$format=A/:@").isAllText("$format=A/:@").isType(UriLexer.FORMAT);
    test.run("$format=A/:@" + reserved).isType(UriLexer.FORMAT).at(4).isText(":@");
    // Test lexer rule PCHAR all
    test.run("$format=" + cPCHAR + "/" + cPCHAR).isAllInput().isType(UriLexer.FORMAT);

  }

}
