package com.limegroup.gnutella.util;

import java.util.NoSuchElementException;


import junit.framework.Test;

public class QuotedStringTokenizerTest extends LimeTestCase {

    public QuotedStringTokenizerTest(String name) {
		super(name);
	}

	public static Test suite() {
        return buildTestSuite(QuotedStringTokenizerTest.class);
    }  
	
	public void testTokenizer() {
		QuotedStringTokenizer t = new QuotedStringTokenizer("a b  c  ");
		assertEquals(t.countTokens(), 3);
		assertEquals("a", t.nextToken());
		assertTrue(t.hasMoreTokens());
		assertEquals("b", t.nextToken());
		assertEquals("c", t.nextToken());
		assertFalse(t.hasMoreTokens());
		assertNoSuchElementExeception(t);
	}

	public void testReturnSeparators() {
		QuotedStringTokenizer t = new QuotedStringTokenizer("a b  c  ", " ",
				true);
		assertEquals(t.countTokens(), 8);
		assertEquals("a", t.nextToken());
		assertEquals(" ", t.nextToken());
		assertEquals("b", t.nextToken());
		assertEquals(" ", t.nextToken());
		assertEquals(" ", t.nextToken());
		assertEquals("c", t.nextToken());
		assertEquals(" ", t.nextToken());
		assertEquals(" ", t.nextToken());
		assertNoSuchElementExeception(t);
	}

	private void assertNoSuchElementExeception(QuotedStringTokenizer t) {
		try {
			String s = t.nextToken();
			fail("Expected NoSuchElementException, got + '" + s + "'");
		} catch (NoSuchElementException e) {
		}
	}

	public void testMultipleSeparators() {
		QuotedStringTokenizer t = new QuotedStringTokenizer("a;b c", "; ");
		assertEquals("a", t.nextToken());
		assertEquals("b", t.nextToken());
		assertEquals("c", t.nextToken());
	}

	public void testMultipleSeparatorsReturnSeparators() {
		QuotedStringTokenizer t = new QuotedStringTokenizer("a;b c;;", "; ",
				true);
		assertEquals("a", t.nextToken());
		assertEquals(";", t.nextToken());
		assertEquals("b", t.nextToken());
		assertEquals(" ", t.nextToken());
		assertEquals("c", t.nextToken());
		assertEquals(";", t.nextToken());
		assertEquals(";", t.nextToken());
	}

	public void testQuotedTokenizer() {
		QuotedStringTokenizer t = new QuotedStringTokenizer("\"a a\" b \"c d\"");
		assertEquals("a a", t.nextToken());
		assertEquals("b", t.nextToken());
		assertEquals("c d", t.nextToken());
	}

	public void testOpenQuote() {
		QuotedStringTokenizer t = new QuotedStringTokenizer("\"a a b \"c d\"");
		assertEquals("a a b c", t.nextToken());
		assertEquals("d", t.nextToken());

		t = new QuotedStringTokenizer("\"a a b \" c d\"");
		assertEquals("a a b ", t.nextToken());
		assertEquals("c", t.nextToken());
		assertEquals("d", t.nextToken());

		t = new QuotedStringTokenizer("\"a");
		assertEquals("a", t.nextToken());
	}

}
