package org.xbib.datastructures.json.iterator.test;

import org.xbib.datastructures.json.iterator.JsonIterator;
import org.xbib.datastructures.json.iterator.spi.JsonException;
import junit.framework.TestCase;
import org.junit.experimental.categories.Category;

import java.io.ByteArrayInputStream;
import java.io.IOException;

public class TestSkip extends TestCase {

    public void test_skip_number() throws IOException {
        JsonIterator iter = JsonIterator.parse("[1,2]");
        assertTrue(iter.readArray());
        iter.skip();
        assertTrue(iter.readArray());
        assertEquals(2, iter.readInt());
        assertFalse(iter.readArray());
    }

    public void test_skip_string() throws IOException {
        JsonIterator iter = JsonIterator.parse("['hello',2]".replace('\'', '"'));
        assertTrue(iter.readArray());
        iter.skip();
        assertTrue(iter.readArray());
        assertEquals(2, iter.readInt());
        assertFalse(iter.readArray());
    }

    @Category(StreamingCategory.class)
    public void test_skip_string_streaming() throws IOException {
        JsonIterator iter = JsonIterator.parse(new ByteArrayInputStream("\"hello".getBytes()), 2);
        try {
            iter.skip();
            fail();
        } catch (JsonException e) {
        }
        iter = JsonIterator.parse(new ByteArrayInputStream("\"hello\"".getBytes()), 2);
        iter.skip();
        iter = JsonIterator.parse(new ByteArrayInputStream("\"hello\"1".getBytes()), 2);
        iter.skip();
        assertEquals(1, iter.readInt());
        iter = JsonIterator.parse(new ByteArrayInputStream("\"h\\\"ello\"1".getBytes()), 3);
        iter.skip();
        assertEquals(1, iter.readInt());
        iter = JsonIterator.parse(new ByteArrayInputStream("\"\\\\\"1".getBytes()), 3);
        iter.skip();
        assertEquals(1, iter.readInt());
    }

    public void test_skip_object() throws IOException {
        JsonIterator iter = JsonIterator.parse("[{'hello': {'world': 'a'}},2]".replace('\'', '"'));
        assertTrue(iter.readArray());
        iter.skip();
        assertTrue(iter.readArray());
        assertEquals(2, iter.readInt());
        assertFalse(iter.readArray());
    }

    public void test_skip_array() throws IOException {
        JsonIterator iter = JsonIterator.parse("[ [1,  3] ,2]".replace('\'', '"'));
        assertTrue(iter.readArray());
        iter.skip();
        assertTrue(iter.readArray());
        assertEquals(2, iter.readInt());
        assertFalse(iter.readArray());
    }

    public void test_skip_nested() throws IOException {
        JsonIterator iter = JsonIterator.parse("[ [1, {'a': ['b'] },  3] ,2]".replace('\'', '"'));
        assertTrue(iter.readArray());
        iter.skip();
        assertTrue(iter.readArray());
        assertEquals(2, iter.readInt());
        assertFalse(iter.readArray());
    }
}
