/*
 * 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.lucene.analysis.miscellaneous;


import java.io.Reader;
import java.io.StringReader;

import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.util.BaseTokenStreamFactoryTestCase;

public class TestCapitalizationFilterFactory extends BaseTokenStreamFactoryTestCase {
  
  public void testCapitalization() throws Exception {
    Reader reader = new StringReader("kiTTEN");
    TokenStream stream = whitespaceMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "keep", "and the it BIG",
        "onlyFirstWord", "true").create(stream);
    assertTokenStreamContents(stream, new String[] { "Kitten" });
  }
  
  public void testCapitalization2() throws Exception {
    Reader reader = new StringReader("and");
    TokenStream stream = whitespaceMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "keep", "and the it BIG",
        "onlyFirstWord", "true",
        "forceFirstLetter", "true").create(stream);
    assertTokenStreamContents(stream, new String[] { "And" });
  }
  
  /** first is forced, but it's not a keep word, either */
  public void testCapitalization3() throws Exception {
    Reader reader = new StringReader("AnD");
    TokenStream stream = whitespaceMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "keep", "and the it BIG",
        "onlyFirstWord", "true",
        "forceFirstLetter", "true").create(stream);
    assertTokenStreamContents(stream, new String[] { "And" });
  }
  
  public void testCapitalization4() throws Exception {
    Reader reader = new StringReader("AnD");
    TokenStream stream = whitespaceMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "keep", "and the it BIG",
        "onlyFirstWord", "true",
        "forceFirstLetter", "false").create(stream);
    assertTokenStreamContents(stream, new String[] { "And" });
  }
  
  public void testCapitalization5() throws Exception {
    Reader reader = new StringReader("big");
    TokenStream stream = whitespaceMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "keep", "and the it BIG",
        "onlyFirstWord", "true",
        "forceFirstLetter", "true").create(stream);
    assertTokenStreamContents(stream, new String[] { "Big" });
  }
  
  public void testCapitalization6() throws Exception {
    Reader reader = new StringReader("BIG");
    TokenStream stream = whitespaceMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "keep", "and the it BIG",
        "onlyFirstWord", "true",
        "forceFirstLetter", "true").create(stream);
    assertTokenStreamContents(stream, new String[] { "BIG" });
  }
  
  public void testCapitalization7() throws Exception {
    Reader reader = new StringReader("Hello thEre my Name is Ryan");
    TokenStream stream = keywordMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "keep", "and the it BIG",
        "onlyFirstWord", "true",
        "forceFirstLetter", "true").create(stream);
    assertTokenStreamContents(stream, new String[] { "Hello there my name is ryan" });
  }
  
  public void testCapitalization8() throws Exception {
    Reader reader = new StringReader("Hello thEre my Name is Ryan");
    TokenStream stream = whitespaceMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "keep", "and the it BIG",
        "onlyFirstWord", "false",
        "forceFirstLetter", "true").create(stream);
    assertTokenStreamContents(stream, new String[] { "Hello", "There", "My", "Name", "Is", "Ryan" });
  }
  
  public void testCapitalization9() throws Exception {
    Reader reader = new StringReader("Hello thEre my Name is Ryan");
    TokenStream stream = whitespaceMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "keep", "and the it BIG",
        "onlyFirstWord", "false",
        "minWordLength", "3",
        "forceFirstLetter", "true").create(stream);
    assertTokenStreamContents(stream, new String[] { "Hello", "There", "my", "Name", "is", "Ryan" });
  }
  
  public void testCapitalization10() throws Exception {
    Reader reader = new StringReader("McKinley");
    TokenStream stream = whitespaceMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "keep", "and the it BIG",
        "onlyFirstWord", "false",
        "minWordLength", "3",
        "forceFirstLetter", "true").create(stream);
    assertTokenStreamContents(stream, new String[] { "Mckinley" });
  }
  
  /** using "McK" as okPrefix */
  public void testCapitalization11() throws Exception {
    Reader reader = new StringReader("McKinley");
    TokenStream stream = whitespaceMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "keep", "and the it BIG",
        "onlyFirstWord", "false",
        "minWordLength", "3",
        "okPrefix", "McK",
        "forceFirstLetter", "true").create(stream);
    assertTokenStreamContents(stream, new String[] { "McKinley" });
  }
  
  /** test with numbers */
  public void testCapitalization12() throws Exception {
    Reader reader = new StringReader("1st 2nd third");
    TokenStream stream = whitespaceMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "keep", "and the it BIG",
        "onlyFirstWord", "false",
        "minWordLength", "3",
        "okPrefix", "McK",
        "forceFirstLetter", "false").create(stream);
    assertTokenStreamContents(stream, new String[] { "1st", "2nd", "Third" });
  }
  
  public void testCapitalization13() throws Exception {
    Reader reader = new StringReader("the The the");
    TokenStream stream = keywordMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "keep", "and the it BIG",
        "onlyFirstWord", "false",
        "minWordLength", "3",
        "okPrefix", "McK",
        "forceFirstLetter", "true").create(stream);
    assertTokenStreamContents(stream, new String[] { "The The the" });
  }

  public void testKeepIgnoreCase() throws Exception {
    Reader reader = new StringReader("kiTTEN");
    TokenStream stream = keywordMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "keep", "kitten",
        "keepIgnoreCase", "true",
        "onlyFirstWord", "true",
        "forceFirstLetter", "true").create(stream);

    assertTokenStreamContents(stream, new String[] { "KiTTEN" });
  }
  
  public void testKeepIgnoreCase2() throws Exception {
    Reader reader = new StringReader("kiTTEN");
    TokenStream stream = keywordMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "keep", "kitten",
        "keepIgnoreCase", "true",
        "onlyFirstWord", "true",
        "forceFirstLetter", "false").create(stream);

    assertTokenStreamContents(stream, new String[] { "kiTTEN" });
  }
  
  public void testKeepIgnoreCase3() throws Exception {
    Reader reader = new StringReader("kiTTEN");
    TokenStream stream = keywordMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "keepIgnoreCase", "true",
        "onlyFirstWord", "true",
        "forceFirstLetter", "false").create(stream);

    assertTokenStreamContents(stream, new String[] { "Kitten" });
  }
  
  /**
   * Test CapitalizationFilterFactory's minWordLength option.
   * 
   * This is very weird when combined with ONLY_FIRST_WORD!!!
   */
  public void testMinWordLength() throws Exception {
    Reader reader = new StringReader("helo testing");
    TokenStream stream = whitespaceMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "onlyFirstWord", "true",
        "minWordLength", "5").create(stream);
    assertTokenStreamContents(stream, new String[] { "helo", "Testing" });
  }
  
  /**
   * Test CapitalizationFilterFactory's maxWordCount option with only words of 1
   * in each token (it should do nothing)
   */
  public void testMaxWordCount() throws Exception {
    Reader reader = new StringReader("one two three four");
    TokenStream stream = whitespaceMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "maxWordCount", "2").create(stream);
    assertTokenStreamContents(stream, new String[] { "One", "Two", "Three", "Four" });
  }
  
  /**
   * Test CapitalizationFilterFactory's maxWordCount option when exceeded
   */
  public void testMaxWordCount2() throws Exception {
    Reader reader = new StringReader("one two three four");
    TokenStream stream = keywordMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "maxWordCount", "2").create(stream);
    assertTokenStreamContents(stream, new String[] { "one two three four" });
  }
  
  /**
   * Test CapitalizationFilterFactory's maxTokenLength option when exceeded
   * 
   * This is weird, it is not really a max, but inclusive (look at 'is')
   */
  public void testMaxTokenLength() throws Exception {
    Reader reader = new StringReader("this is a test");
    TokenStream stream = whitespaceMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "maxTokenLength", "2").create(stream);
    assertTokenStreamContents(stream, new String[] { "this", "is", "A", "test" });
  }
  
  /**
   * Test CapitalizationFilterFactory's forceFirstLetter option
   */
  public void testForceFirstLetterWithKeep() throws Exception {
    Reader reader = new StringReader("kitten");
    TokenStream stream = whitespaceMockTokenizer(reader);
    stream = tokenFilterFactory("Capitalization",
        "keep", "kitten",
        "forceFirstLetter", "true").create(stream);
    assertTokenStreamContents(stream, new String[] { "Kitten" });
  }
  
  /** Test that bogus arguments result in exception */
  public void testBogusArguments() throws Exception {
    IllegalArgumentException expected = expectThrows(IllegalArgumentException.class, () -> {
      tokenFilterFactory("Capitalization", "bogusArg", "bogusValue");
    });
    assertTrue(expected.getMessage().contains("Unknown parameters"));
  }

  /**
   * Test that invalid arguments result in exception
   */
  public void testInvalidArguments() throws Exception {
    for (final String arg : new String[]{"minWordLength", "maxTokenLength", "maxWordCount"}) {
      IllegalArgumentException expected = expectThrows(IllegalArgumentException.class, () -> {
        Reader reader = new StringReader("foo foobar super-duper-trooper");
        TokenStream stream = whitespaceMockTokenizer(reader);

        tokenFilterFactory("Capitalization",
            "keep", "and the it BIG",
            "onlyFirstWord", "false",
            arg, "-3",
            "okPrefix", "McK",
            "forceFirstLetter", "true").create(stream);
      });
      assertTrue(expected.getMessage().contains(arg + " must be greater than or equal to zero") ||
                 expected.getMessage().contains(arg + " must be greater than zero"));
    }
  }
}
