/*
 * 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.el;

import java.io.IOException;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.BaseTokenStreamTestCase;
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.core.KeywordTokenizer;

public class TestGreekStemmer extends BaseTokenStreamTestCase {
  private Analyzer a;

  @Override
  public void setUp() throws Exception {
    super.setUp();
    a = new GreekAnalyzer();
  }

  @Override
  public void tearDown() throws Exception {
    a.close();
    super.tearDown();
  }

  public void testMasculineNouns() throws Exception {
    // -ος
    checkOneTerm(a, "άνθρωπος", "ανθρωπ");
    checkOneTerm(a, "ανθρώπου", "ανθρωπ");
    checkOneTerm(a, "άνθρωπο", "ανθρωπ");
    checkOneTerm(a, "άνθρωπε", "ανθρωπ");
    checkOneTerm(a, "άνθρωποι", "ανθρωπ");
    checkOneTerm(a, "ανθρώπων", "ανθρωπ");
    checkOneTerm(a, "ανθρώπους", "ανθρωπ");
    checkOneTerm(a, "άνθρωποι", "ανθρωπ");

    // -ης
    checkOneTerm(a, "πελάτης", "πελατ");
    checkOneTerm(a, "πελάτη", "πελατ");
    checkOneTerm(a, "πελάτες", "πελατ");
    checkOneTerm(a, "πελατών", "πελατ");

    // -ας/-ες
    checkOneTerm(a, "ελέφαντας", "ελεφαντ");
    checkOneTerm(a, "ελέφαντα", "ελεφαντ");
    checkOneTerm(a, "ελέφαντες", "ελεφαντ");
    checkOneTerm(a, "ελεφάντων", "ελεφαντ");

    // -ας/-αδες
    checkOneTerm(a, "μπαμπάς", "μπαμπ");
    checkOneTerm(a, "μπαμπά", "μπαμπ");
    checkOneTerm(a, "μπαμπάδες", "μπαμπ");
    checkOneTerm(a, "μπαμπάδων", "μπαμπ");

    // -ης/-ηδες
    checkOneTerm(a, "μπακάλης", "μπακαλ");
    checkOneTerm(a, "μπακάλη", "μπακαλ");
    checkOneTerm(a, "μπακάληδες", "μπακαλ");
    checkOneTerm(a, "μπακάληδων", "μπακαλ");

    // -ες
    checkOneTerm(a, "καφές", "καφ");
    checkOneTerm(a, "καφέ", "καφ");
    checkOneTerm(a, "καφέδες", "καφ");
    checkOneTerm(a, "καφέδων", "καφ");

    // -έας/είς
    checkOneTerm(a, "γραμματέας", "γραμματε");
    checkOneTerm(a, "γραμματέα", "γραμματε");
    // plural forms conflate w/ each other, not w/ the sing forms
    checkOneTerm(a, "γραμματείς", "γραμματ");
    checkOneTerm(a, "γραμματέων", "γραμματ");

    // -ους/οι
    checkOneTerm(a, "απόπλους", "αποπλ");
    checkOneTerm(a, "απόπλου", "αποπλ");
    checkOneTerm(a, "απόπλοι", "αποπλ");
    checkOneTerm(a, "απόπλων", "αποπλ");

    // -ους/-ουδες
    checkOneTerm(a, "παππούς", "παππ");
    checkOneTerm(a, "παππού", "παππ");
    checkOneTerm(a, "παππούδες", "παππ");
    checkOneTerm(a, "παππούδων", "παππ");

    // -ης/-εις
    checkOneTerm(a, "λάτρης", "λατρ");
    checkOneTerm(a, "λάτρη", "λατρ");
    checkOneTerm(a, "λάτρεις", "λατρ");
    checkOneTerm(a, "λάτρεων", "λατρ");

    // -υς
    checkOneTerm(a, "πέλεκυς", "πελεκ");
    checkOneTerm(a, "πέλεκυ", "πελεκ");
    checkOneTerm(a, "πελέκεις", "πελεκ");
    checkOneTerm(a, "πελέκεων", "πελεκ");

    // -ωρ
    // note: nom./voc. doesn't conflate w/ the rest
    checkOneTerm(a, "μέντωρ", "μεντωρ");
    checkOneTerm(a, "μέντορος", "μεντορ");
    checkOneTerm(a, "μέντορα", "μεντορ");
    checkOneTerm(a, "μέντορες", "μεντορ");
    checkOneTerm(a, "μεντόρων", "μεντορ");

    // -ων
    checkOneTerm(a, "αγώνας", "αγων");
    checkOneTerm(a, "αγώνος", "αγων");
    checkOneTerm(a, "αγώνα", "αγων");
    checkOneTerm(a, "αγώνα", "αγων");
    checkOneTerm(a, "αγώνες", "αγων");
    checkOneTerm(a, "αγώνων", "αγων");

    // -ας/-ηδες
    checkOneTerm(a, "αέρας", "αερ");
    checkOneTerm(a, "αέρα", "αερ");
    checkOneTerm(a, "αέρηδες", "αερ");
    checkOneTerm(a, "αέρηδων", "αερ");

    // -ης/-ητες
    checkOneTerm(a, "γόης", "γο");
    checkOneTerm(a, "γόη", "γοη"); // too short
    // the two plural forms conflate
    checkOneTerm(a, "γόητες", "γοητ");
    checkOneTerm(a, "γοήτων", "γοητ");
  }

  public void testFeminineNouns() throws Exception {
    // -α/-ες,-ών
    checkOneTerm(a, "φορά", "φορ");
    checkOneTerm(a, "φοράς", "φορ");
    checkOneTerm(a, "φορές", "φορ");
    checkOneTerm(a, "φορών", "φορ");

    // -α/-ες,-ων
    checkOneTerm(a, "αγελάδα", "αγελαδ");
    checkOneTerm(a, "αγελάδας", "αγελαδ");
    checkOneTerm(a, "αγελάδες", "αγελαδ");
    checkOneTerm(a, "αγελάδων", "αγελαδ");

    // -η/-ες
    checkOneTerm(a, "ζάχαρη", "ζαχαρ");
    checkOneTerm(a, "ζάχαρης", "ζαχαρ");
    checkOneTerm(a, "ζάχαρες", "ζαχαρ");
    checkOneTerm(a, "ζαχάρεων", "ζαχαρ");

    // -η/-εις
    checkOneTerm(a, "τηλεόραση", "τηλεορασ");
    checkOneTerm(a, "τηλεόρασης", "τηλεορασ");
    checkOneTerm(a, "τηλεοράσεις", "τηλεορασ");
    checkOneTerm(a, "τηλεοράσεων", "τηλεορασ");

    // -α/-αδες
    checkOneTerm(a, "μαμά", "μαμ");
    checkOneTerm(a, "μαμάς", "μαμ");
    checkOneTerm(a, "μαμάδες", "μαμ");
    checkOneTerm(a, "μαμάδων", "μαμ");

    // -ος
    checkOneTerm(a, "λεωφόρος", "λεωφορ");
    checkOneTerm(a, "λεωφόρου", "λεωφορ");
    checkOneTerm(a, "λεωφόρο", "λεωφορ");
    checkOneTerm(a, "λεωφόρε", "λεωφορ");
    checkOneTerm(a, "λεωφόροι", "λεωφορ");
    checkOneTerm(a, "λεωφόρων", "λεωφορ");
    checkOneTerm(a, "λεωφόρους", "λεωφορ");

    // -ου
    checkOneTerm(a, "αλεπού", "αλεπ");
    checkOneTerm(a, "αλεπούς", "αλεπ");
    checkOneTerm(a, "αλεπούδες", "αλεπ");
    checkOneTerm(a, "αλεπούδων", "αλεπ");

    // -έας/είς
    // note: not all forms conflate
    checkOneTerm(a, "γραμματέας", "γραμματε");
    checkOneTerm(a, "γραμματέως", "γραμματ");
    checkOneTerm(a, "γραμματέα", "γραμματε");
    checkOneTerm(a, "γραμματείς", "γραμματ");
    checkOneTerm(a, "γραμματέων", "γραμματ");
  }

  public void testNeuterNouns() throws Exception {
    // ending with -ο
    // note: nom doesnt conflate
    checkOneTerm(a, "βιβλίο", "βιβλι");
    checkOneTerm(a, "βιβλίου", "βιβλ");
    checkOneTerm(a, "βιβλία", "βιβλ");
    checkOneTerm(a, "βιβλίων", "βιβλ");

    // ending with -ι
    checkOneTerm(a, "πουλί", "πουλ");
    checkOneTerm(a, "πουλιού", "πουλ");
    checkOneTerm(a, "πουλιά", "πουλ");
    checkOneTerm(a, "πουλιών", "πουλ");

    // ending with -α
    // note: nom. doesnt conflate
    checkOneTerm(a, "πρόβλημα", "προβλημ");
    checkOneTerm(a, "προβλήματος", "προβλημα");
    checkOneTerm(a, "προβλήματα", "προβλημα");
    checkOneTerm(a, "προβλημάτων", "προβλημα");

    // ending with -ος/-ους
    checkOneTerm(a, "πέλαγος", "πελαγ");
    checkOneTerm(a, "πελάγους", "πελαγ");
    checkOneTerm(a, "πελάγη", "πελαγ");
    checkOneTerm(a, "πελάγων", "πελαγ");

    // ending with -ός/-ότος
    checkOneTerm(a, "γεγονός", "γεγον");
    checkOneTerm(a, "γεγονότος", "γεγον");
    checkOneTerm(a, "γεγονότα", "γεγον");
    checkOneTerm(a, "γεγονότων", "γεγον");

    // ending with -υ/-ιου
    checkOneTerm(a, "βράδυ", "βραδ");
    checkOneTerm(a, "βράδι", "βραδ");
    checkOneTerm(a, "βραδιού", "βραδ");
    checkOneTerm(a, "βράδια", "βραδ");
    checkOneTerm(a, "βραδιών", "βραδ");

    // ending with -υ/-ατος
    // note: nom. doesnt conflate
    checkOneTerm(a, "δόρυ", "δορ");
    checkOneTerm(a, "δόρατος", "δορατ");
    checkOneTerm(a, "δόρατα", "δορατ");
    checkOneTerm(a, "δοράτων", "δορατ");

    // ending with -ας
    checkOneTerm(a, "κρέας", "κρε");
    checkOneTerm(a, "κρέατος", "κρε");
    checkOneTerm(a, "κρέατα", "κρε");
    checkOneTerm(a, "κρεάτων", "κρε");

    // ending with -ως
    checkOneTerm(a, "λυκόφως", "λυκοφω");
    checkOneTerm(a, "λυκόφωτος", "λυκοφω");
    checkOneTerm(a, "λυκόφωτα", "λυκοφω");
    checkOneTerm(a, "λυκοφώτων", "λυκοφω");

    // ending with -ον/-ου
    // note: nom. doesnt conflate
    checkOneTerm(a, "μέσον", "μεσον");
    checkOneTerm(a, "μέσου", "μεσ");
    checkOneTerm(a, "μέσα", "μεσ");
    checkOneTerm(a, "μέσων", "μεσ");

    // ending in -ον/-οντος
    // note: nom. doesnt conflate
    checkOneTerm(a, "ενδιαφέρον", "ενδιαφερον");
    checkOneTerm(a, "ενδιαφέροντος", "ενδιαφεροντ");
    checkOneTerm(a, "ενδιαφέροντα", "ενδιαφεροντ");
    checkOneTerm(a, "ενδιαφερόντων", "ενδιαφεροντ");

    // ending with -εν/-εντος
    checkOneTerm(a, "ανακοινωθέν", "ανακοινωθεν");
    checkOneTerm(a, "ανακοινωθέντος", "ανακοινωθεντ");
    checkOneTerm(a, "ανακοινωθέντα", "ανακοινωθεντ");
    checkOneTerm(a, "ανακοινωθέντων", "ανακοινωθεντ");

    // ending with -αν/-αντος
    checkOneTerm(a, "σύμπαν", "συμπ");
    checkOneTerm(a, "σύμπαντος", "συμπαντ");
    checkOneTerm(a, "σύμπαντα", "συμπαντ");
    checkOneTerm(a, "συμπάντων", "συμπαντ");

    // ending with  -α/-ακτος
    checkOneTerm(a, "γάλα", "γαλ");
    checkOneTerm(a, "γάλακτος", "γαλακτ");
    checkOneTerm(a, "γάλατα", "γαλατ");
    checkOneTerm(a, "γαλάκτων", "γαλακτ");
  }

  public void testAdjectives() throws Exception {
    // ending with -ής, -ές/-είς, -ή
    checkOneTerm(a, "συνεχής", "συνεχ");
    checkOneTerm(a, "συνεχούς", "συνεχ");
    checkOneTerm(a, "συνεχή", "συνεχ");
    checkOneTerm(a, "συνεχών", "συνεχ");
    checkOneTerm(a, "συνεχείς", "συνεχ");
    checkOneTerm(a, "συνεχές", "συνεχ");

    // ending with -ης, -ες/-εις, -η
    checkOneTerm(a, "συνήθης", "συνηθ");
    checkOneTerm(a, "συνήθους", "συνηθ");
    checkOneTerm(a, "συνήθη", "συνηθ");
    // note: doesn't conflate
    checkOneTerm(a, "συνήθεις", "συν");
    checkOneTerm(a, "συνήθων", "συνηθ");
    checkOneTerm(a, "σύνηθες", "συνηθ");

    // ending with -υς, -υ/-εις, -ια
    checkOneTerm(a, "βαθύς", "βαθ");
    checkOneTerm(a, "βαθέος", "βαθε");
    checkOneTerm(a, "βαθύ", "βαθ");
    checkOneTerm(a, "βαθείς", "βαθ");
    checkOneTerm(a, "βαθέων", "βαθ");

    checkOneTerm(a, "βαθιά", "βαθ");
    checkOneTerm(a, "βαθιάς", "βαθι");
    checkOneTerm(a, "βαθιές", "βαθι");
    checkOneTerm(a, "βαθιών", "βαθ");

    checkOneTerm(a, "βαθέα", "βαθε");

    // comparative/superlative
    checkOneTerm(a, "ψηλός", "ψηλ");
    checkOneTerm(a, "ψηλότερος", "ψηλ");
    checkOneTerm(a, "ψηλότατος", "ψηλ");

    checkOneTerm(a, "ωραίος", "ωραι");
    checkOneTerm(a, "ωραιότερος", "ωραι");
    checkOneTerm(a, "ωραιότατος", "ωραι");

    checkOneTerm(a, "επιεικής", "επιεικ");
    checkOneTerm(a, "επιεικέστερος", "επιεικ");
    checkOneTerm(a, "επιεικέστατος", "επιεικ");
  }

  public void testVerbs() throws Exception {
    // note, past/present verb stems will not conflate (from the paper)
    // -ω,-α/-.ω,-.α
    checkOneTerm(a, "ορίζω", "οριζ");
    checkOneTerm(a, "όριζα", "οριζ");
    checkOneTerm(a, "όριζε", "οριζ");
    checkOneTerm(a, "ορίζοντας", "οριζ");
    checkOneTerm(a, "ορίζομαι", "οριζ");
    checkOneTerm(a, "οριζόμουν", "οριζ");
    checkOneTerm(a, "ορίζεσαι", "οριζ");

    checkOneTerm(a, "όρισα", "ορισ");
    checkOneTerm(a, "ορίσω", "ορισ");
    checkOneTerm(a, "όρισε", "ορισ");
    checkOneTerm(a, "ορίσει", "ορισ");

    checkOneTerm(a, "ορίστηκα", "οριστ");
    checkOneTerm(a, "οριστώ", "οριστ");
    checkOneTerm(a, "οριστείς", "οριστ");
    checkOneTerm(a, "οριστεί", "οριστ");

    checkOneTerm(a, "ορισμένο", "ορισμεν");
    checkOneTerm(a, "ορισμένη", "ορισμεν");
    checkOneTerm(a, "ορισμένος", "ορισμεν");

    // -ω,-α/-ξω,-ξα
    checkOneTerm(a, "ανοίγω", "ανοιγ");
    checkOneTerm(a, "άνοιγα", "ανοιγ");
    checkOneTerm(a, "άνοιγε", "ανοιγ");
    checkOneTerm(a, "ανοίγοντας", "ανοιγ");
    checkOneTerm(a, "ανοίγομαι", "ανοιγ");
    checkOneTerm(a, "ανοιγόμουν", "ανοιγ");

    checkOneTerm(a, "άνοιξα", "ανοιξ");
    checkOneTerm(a, "ανοίξω", "ανοιξ");
    checkOneTerm(a, "άνοιξε", "ανοιξ");
    checkOneTerm(a, "ανοίξει", "ανοιξ");

    checkOneTerm(a, "ανοίχτηκα", "ανοιχτ");
    checkOneTerm(a, "ανοιχτώ", "ανοιχτ");
    checkOneTerm(a, "ανοίχτηκα", "ανοιχτ");
    checkOneTerm(a, "ανοιχτείς", "ανοιχτ");
    checkOneTerm(a, "ανοιχτεί", "ανοιχτ");

    checkOneTerm(a, "ανοίξου", "ανοιξ");

    // -ώ/-άω,-ούσα/-άσω,-ασα
    checkOneTerm(a, "περνώ", "περν");
    checkOneTerm(a, "περνάω", "περν");
    checkOneTerm(a, "περνούσα", "περν");
    checkOneTerm(a, "πέρναγα", "περν");
    checkOneTerm(a, "πέρνα", "περν");
    checkOneTerm(a, "περνώντας", "περν");

    checkOneTerm(a, "πέρασα", "περασ");
    checkOneTerm(a, "περάσω", "περασ");
    checkOneTerm(a, "πέρασε", "περασ");
    checkOneTerm(a, "περάσει", "περασ");

    checkOneTerm(a, "περνιέμαι", "περν");
    checkOneTerm(a, "περνιόμουν", "περν");

    checkOneTerm(a, "περάστηκα", "περαστ");
    checkOneTerm(a, "περαστώ", "περαστ");
    checkOneTerm(a, "περαστείς", "περαστ");
    checkOneTerm(a, "περαστεί", "περαστ");

    checkOneTerm(a, "περασμένο", "περασμεν");
    checkOneTerm(a, "περασμένη", "περασμεν");
    checkOneTerm(a, "περασμένος", "περασμεν");

    // -ώ/-άω,-ούσα/-άξω,-αξα
    checkOneTerm(a, "πετώ", "πετ");
    checkOneTerm(a, "πετάω", "πετ");
    checkOneTerm(a, "πετούσα", "πετ");
    checkOneTerm(a, "πέταγα", "πετ");
    checkOneTerm(a, "πέτα", "πετ");
    checkOneTerm(a, "πετώντας", "πετ");
    checkOneTerm(a, "πετιέμαι", "πετ");
    checkOneTerm(a, "πετιόμουν", "πετ");

    checkOneTerm(a, "πέταξα", "πεταξ");
    checkOneTerm(a, "πετάξω", "πεταξ");
    checkOneTerm(a, "πέταξε", "πεταξ");
    checkOneTerm(a, "πετάξει", "πεταξ");

    checkOneTerm(a, "πετάχτηκα", "πεταχτ");
    checkOneTerm(a, "πεταχτώ", "πεταχτ");
    checkOneTerm(a, "πεταχτείς", "πεταχτ");
    checkOneTerm(a, "πεταχτεί", "πεταχτ");

    checkOneTerm(a, "πεταμένο", "πεταμεν");
    checkOneTerm(a, "πεταμένη", "πεταμεν");
    checkOneTerm(a, "πεταμένος", "πεταμεν");

    // -ώ/-άω,-ούσα / -έσω,-εσα
    checkOneTerm(a, "καλώ", "καλ");
    checkOneTerm(a, "καλούσα", "καλ");
    checkOneTerm(a, "καλείς", "καλ");
    checkOneTerm(a, "καλώντας", "καλ");

    checkOneTerm(a, "καλούμαι", "καλ");
    // pass. imperfect /imp. progressive doesnt conflate
    checkOneTerm(a, "καλούμουν", "καλουμ");
    checkOneTerm(a, "καλείσαι", "καλεισα");

    checkOneTerm(a, "καλέστηκα", "καλεστ");
    checkOneTerm(a, "καλεστώ", "καλεστ");
    checkOneTerm(a, "καλεστείς", "καλεστ");
    checkOneTerm(a, "καλεστεί", "καλεστ");

    checkOneTerm(a, "καλεσμένο", "καλεσμεν");
    checkOneTerm(a, "καλεσμένη", "καλεσμεν");
    checkOneTerm(a, "καλεσμένος", "καλεσμεν");

    checkOneTerm(a, "φορώ", "φορ");
    checkOneTerm(a, "φοράω", "φορ");
    checkOneTerm(a, "φορούσα", "φορ");
    checkOneTerm(a, "φόραγα", "φορ");
    checkOneTerm(a, "φόρα", "φορ");
    checkOneTerm(a, "φορώντας", "φορ");
    checkOneTerm(a, "φοριέμαι", "φορ");
    checkOneTerm(a, "φοριόμουν", "φορ");
    checkOneTerm(a, "φοριέσαι", "φορ");

    checkOneTerm(a, "φόρεσα", "φορεσ");
    checkOneTerm(a, "φορέσω", "φορεσ");
    checkOneTerm(a, "φόρεσε", "φορεσ");
    checkOneTerm(a, "φορέσει", "φορεσ");

    checkOneTerm(a, "φορέθηκα", "φορεθ");
    checkOneTerm(a, "φορεθώ", "φορεθ");
    checkOneTerm(a, "φορεθείς", "φορεθ");
    checkOneTerm(a, "φορεθεί", "φορεθ");

    checkOneTerm(a, "φορεμένο", "φορεμεν");
    checkOneTerm(a, "φορεμένη", "φορεμεν");
    checkOneTerm(a, "φορεμένος", "φορεμεν");

    // -ώ/-άω,-ούσα / -ήσω,-ησα
    checkOneTerm(a, "κρατώ", "κρατ");
    checkOneTerm(a, "κρατάω", "κρατ");
    checkOneTerm(a, "κρατούσα", "κρατ");
    checkOneTerm(a, "κράταγα", "κρατ");
    checkOneTerm(a, "κράτα", "κρατ");
    checkOneTerm(a, "κρατώντας", "κρατ");

    checkOneTerm(a, "κράτησα", "κρατ");
    checkOneTerm(a, "κρατήσω", "κρατ");
    checkOneTerm(a, "κράτησε", "κρατ");
    checkOneTerm(a, "κρατήσει", "κρατ");

    checkOneTerm(a, "κρατούμαι", "κρατ");
    checkOneTerm(a, "κρατιέμαι", "κρατ");
    // this imperfect form doesnt conflate
    checkOneTerm(a, "κρατούμουν", "κρατουμ");
    checkOneTerm(a, "κρατιόμουν", "κρατ");
    // this imp. prog form doesnt conflate
    checkOneTerm(a, "κρατείσαι", "κρατεισα");

    checkOneTerm(a, "κρατήθηκα", "κρατ");
    checkOneTerm(a, "κρατηθώ", "κρατ");
    checkOneTerm(a, "κρατηθείς", "κρατ");
    checkOneTerm(a, "κρατηθεί", "κρατ");
    checkOneTerm(a, "κρατήσου", "κρατ");

    checkOneTerm(a, "κρατημένο", "κρατημεν");
    checkOneTerm(a, "κρατημένη", "κρατημεν");
    checkOneTerm(a, "κρατημένος", "κρατημεν");

    // -.μαι,-.μουν / -.ώ,-.ηκα
    checkOneTerm(a, "κοιμάμαι", "κοιμ");
    checkOneTerm(a, "κοιμόμουν", "κοιμ");
    checkOneTerm(a, "κοιμάσαι", "κοιμ");

    checkOneTerm(a, "κοιμήθηκα", "κοιμ");
    checkOneTerm(a, "κοιμηθώ", "κοιμ");
    checkOneTerm(a, "κοιμήσου", "κοιμ");
    checkOneTerm(a, "κοιμηθεί", "κοιμ");

    checkOneTerm(a, "κοιμισμένο", "κοιμισμεν");
    checkOneTerm(a, "κοιμισμένη", "κοιμισμεν");
    checkOneTerm(a, "κοιμισμένος", "κοιμισμεν");
  }

  public void testExceptions() throws Exception {
    checkOneTerm(a, "καθεστώτα", "καθεστ");
    checkOneTerm(a, "καθεστώτος", "καθεστ");
    checkOneTerm(a, "καθεστώς", "καθεστ");
    checkOneTerm(a, "καθεστώτων", "καθεστ");

    checkOneTerm(a, "χουμε", "χουμ");
    checkOneTerm(a, "χουμ", "χουμ");

    checkOneTerm(a, "υποταγεσ", "υποταγ");
    checkOneTerm(a, "υποταγ", "υποταγ");

    checkOneTerm(a, "εμετε", "εμετ");
    checkOneTerm(a, "εμετ", "εμετ");

    checkOneTerm(a, "αρχοντασ", "αρχοντ");
    checkOneTerm(a, "αρχοντων", "αρχοντ");
  }

  public void testEmptyTerm() throws IOException {
    Analyzer a =
        new Analyzer() {
          @Override
          protected TokenStreamComponents createComponents(String fieldName) {
            Tokenizer tokenizer = new KeywordTokenizer();
            return new TokenStreamComponents(tokenizer, new GreekStemFilter(tokenizer));
          }
        };
    checkOneTerm(a, "", "");
    a.close();
  }
}
