/**
 * Copyright (c) 2008-2010, http://www.snakeyaml.org
 *
 * 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 org.yaml.snakeyaml.resolver;

import junit.framework.TestCase;

public class RagelMachineTest extends TestCase {
    private RagelMachine machine = new RagelMachine();

    public void testScan() {
        assertNull(machine.scan("abc"));
    }

    public void testNullPointerException() {
        try {
            machine.scan(null);
            fail("null must not be accepted.");
        } catch (NullPointerException e) {
            assertEquals("Scalar must be provided.", e.getMessage());
        }
    }

    public void testScanBoolean() {
        assertEquals("tag:yaml.org,2002:bool", machine.scan("true"));
        assertEquals("tag:yaml.org,2002:bool", machine.scan("True"));
        assertEquals("tag:yaml.org,2002:bool", machine.scan("TRUE"));
        assertEquals("tag:yaml.org,2002:bool", machine.scan("false"));
        assertEquals("tag:yaml.org,2002:bool", machine.scan("False"));
        assertEquals("tag:yaml.org,2002:bool", machine.scan("FALSE"));
        assertEquals("tag:yaml.org,2002:bool", machine.scan("on"));
        assertEquals("tag:yaml.org,2002:bool", machine.scan("ON"));
        assertEquals("tag:yaml.org,2002:bool", machine.scan("On"));
        assertEquals("tag:yaml.org,2002:bool", machine.scan("off"));
        assertEquals("tag:yaml.org,2002:bool", machine.scan("Off"));
        assertEquals("tag:yaml.org,2002:bool", machine.scan("OFF"));
        assertEquals("tag:yaml.org,2002:bool", machine.scan("on"));
        assertEquals("tag:yaml.org,2002:bool", machine.scan("ON"));
        assertEquals("tag:yaml.org,2002:bool", machine.scan("On"));
        assertEquals("tag:yaml.org,2002:bool", machine.scan("off"));
        assertEquals("tag:yaml.org,2002:bool", machine.scan("Off"));
        assertEquals("tag:yaml.org,2002:bool", machine.scan("OFF"));
    }

    public void testScanNull() {
        assertEquals("tag:yaml.org,2002:null", machine.scan("null"));
        assertEquals("tag:yaml.org,2002:null", machine.scan("Null"));
        assertEquals("tag:yaml.org,2002:null", machine.scan("NULL"));
        assertEquals("tag:yaml.org,2002:null", machine.scan("~"));
        assertEquals("tag:yaml.org,2002:null", machine.scan(" "));
        assertEquals("tag:yaml.org,2002:null", machine.scan(""));
    }

    public void testScanMerge() {
        assertEquals("tag:yaml.org,2002:merge", machine.scan("<<"));
    }

    public void testScanValue() {
        assertEquals("tag:yaml.org,2002:value", machine.scan("="));
    }

    public void testScanInt() {
        assertEquals("tag:yaml.org,2002:int", machine.scan("0"));
        assertEquals("tag:yaml.org,2002:int", machine.scan("1"));
        assertEquals("tag:yaml.org,2002:int", machine.scan("-0"));
        assertEquals("tag:yaml.org,2002:int", machine.scan("-9"));
        assertEquals("tag:yaml.org,2002:int", machine.scan("0b0011"));
        assertEquals("tag:yaml.org,2002:int", machine.scan("0x12ef"));
        assertEquals("tag:yaml.org,2002:int", machine.scan("0123"));
        assertEquals("tag:yaml.org,2002:int", machine.scan("1_000"));
        assertEquals("tag:yaml.org,2002:int", machine.scan("1_000_000"));
        assertEquals("tag:yaml.org,2002:int", machine.scan("+0"));
        assertEquals("tag:yaml.org,2002:int", machine.scan("+10"));
        assertEquals("tag:yaml.org,2002:int", machine.scan("1__000"));
        assertEquals("tag:yaml.org,2002:int", machine.scan("24:12:34"));
        assertEquals("tag:yaml.org,2002:int", machine.scan("240:12:34"));
    }

    public void testScanFloat() {
        assertEquals("tag:yaml.org,2002:float", machine.scan("1.0"));
        assertEquals("tag:yaml.org,2002:float", machine.scan("-0.0"));
        assertEquals("tag:yaml.org,2002:float", machine.scan("+2.2310"));
        assertEquals("tag:yaml.org,2002:float", machine.scan("1.0e+12"));
        assertEquals("tag:yaml.org,2002:float", machine.scan("1.345e-3"));
        assertEquals("tag:yaml.org,2002:float", machine.scan("190:20:30.15"));
        assertEquals("tag:yaml.org,2002:float", machine.scan("-.inf"));
        assertEquals("tag:yaml.org,2002:float", machine.scan("+.INF"));
        assertEquals("tag:yaml.org,2002:float", machine.scan(".Inf"));
        assertEquals("tag:yaml.org,2002:float", machine.scan(".nan"));
        assertEquals("tag:yaml.org,2002:float", machine.scan(".NaN"));
        assertEquals("tag:yaml.org,2002:float", machine.scan(".NAN"));
        assertEquals("tag:yaml.org,2002:float", machine.scan("1_000.5"));
        assertEquals("tag:yaml.org,2002:float", machine.scan("1.023_456"));
        assertEquals("tag:yaml.org,2002:float", machine.scan("-1_123.45"));
        assertEquals("tag:yaml.org,2002:float", machine.scan(".5"));
        assertEquals("tag:yaml.org,2002:float", machine.scan("1.E+1"));
        assertNull(machine.scan("0x1,1"), machine.scan("0x1,1"));
    }

    public void testScanTimestamp() {
        assertEquals("tag:yaml.org,2002:timestamp", machine.scan("2009-02-28"));
        assertEquals("tag:yaml.org,2002:timestamp", machine.scan("2001-12-15T02:59:43.1Z"));
        assertEquals("tag:yaml.org,2002:timestamp", machine.scan("2001-12-14t21:59:43.10-05:00"));
        assertEquals("tag:yaml.org,2002:timestamp", machine.scan("2001-12-14 21:59:43.10 -5"));
        assertEquals("tag:yaml.org,2002:timestamp", machine.scan("2001-12-15 2:59:43.10"));
    }
}
