@Test
 public void testA3pl() {
   Tester tester = new Tester("elma", "mavi [P:Adj]");
   tester.assertHasParses("elmalar", "elmalara", "elmalarda", "elmalardaki", "elmalardakilerdeki");
   tester.assertHasParses("elmalardı", "elmalaraydı", "elmalardır", "elmalardandır", "elmalarsa");
   tester.assertHasParses("maviler", "mavilere", "mavilerim", "mavilerdendir", "mavilerdeymiş");
 }
 @Test
 public void testCausative() {
   Tester tester = new Tester("yapmak", "aramak");
   tester.assertHasParses("yaptırttır", "yaptır", "yaptırt", "arat", "arattır", "arattırt");
   tester.assertHasParses("yaptırarak", "yaptırtarak", "yaptırtmayacak");
   tester.assertUnParseable("yapt", "aratt");
 }
 @Test
 public void testFuture() {
   Tester tester = new Tester("aramak", "gitmek [A:Voicing, Aorist_A]");
   tester.assertHasParses(
       "arayacak", "arayacağız", "aramayacak", "aratacak", "arayacaklar", "arayacaktık");
   tester.assertHasParses("gidecek", "gideceğiz", "gitmeyecek", "gidecekler", "gidecektik");
 }
 @Test
 public void testAorist() {
   Tester tester =
       new Tester("aramak", "gitmek [A:Voicing, Aorist_A]", "gelmek [A:NonTransitive, Aorist_I]");
   tester.assertHasParses("arar", "ararsa", "gider", "gelir", "aramaz");
   tester.assertHasParses("ararlar", "ararlarsa", "ararsalar");
   tester.assertUnParseable("geler", "gidir");
 }
 @Test
 public void testAcquire() {
   // noun
   Tester tester = new Tester("elma", "mavi [P:Adj]");
   tester.assertHasParses("elmalan", "elmalanıyor", "elmalandırmak");
   // adj
   tester.assertHasParses("mavilendirilebileceğinden");
 }
 @Test
 public void testBecome() {
   // noun
   Tester tester = new Tester("elma", "mavi [P:Adj]");
   tester.assertHasParses("elmalaş");
   // adj
   tester.assertHasParses("mavileş");
 }
 @Test
 public void testProgressive() {
   // Noun-Noun
   Tester tester = new Tester("aramak", "gelmek");
   tester.assertHasParses(
       "arıyor", "aramıyor", "geliyor", "gelmiyor", "arıyordu", "arıyorlardı", "gelmiyorlarsa");
   tester.assertHasParses("arıyormuş", "aramıyorsak", "geliyormuşuz");
   tester.assertHasParses("aramakta", "aramamakta", "gelmekte", "gelmemekte");
 }
 @Test
 public void testRelated() {
   // Noun-Adj
   Tester tester = new Tester("elma");
   tester.assertHasParses("elmadaki", "elmadakini");
   tester.assertHasParses("elmanınki", "elmanınkinde", "elmanınkinden");
   tester.assertUnParseable("elmaki", "elmayaki", "elmadakiki");
   // TODO: add akşamki etc. uses Rel_kI instead of Rel_ki
 }
 @Test
 public void testPassive() {
   // Noun-Noun
   Tester tester = new Tester("yapmak", "aramak", "gelmek");
   tester.assertHasParses("aranıl", "yapıl", "aran", "gelin", "gelinil");
   tester.assertUnParseable("aral", "gelil", "kavurul", "kavurunul");
   // causative and passive
   tester.assertHasParses(
       "yaptırıl", "yaptırtıl", "yaptırttırıl", "aratıl", "arattırıl", "arattırtıl");
 }
 @Test
 public void possession() {
   Tester tester = new Tester("elma", "mavi [P:Adj]");
   tester.assertHasParses("elmam", "elman", "elması", "elmamız", "elmaları");
   tester.assertHasParses("elmamı", "elmanda", "elmasında", "elmamızdan", "elmalarıyla");
   tester.assertHasParses("mavim", "mavin", "mavisi", "mavimiz", "mavileri");
   tester.assertHasParses("mavimi", "mavinde", "mavisinden", "mavimizde", "mavileriyle");
   tester.assertHasParses("elmamdı", "elmammış", "elmamızsa", "elmamızdır");
   tester.assertHasParses("mavimdi", "mavinmiş", "mavisiyse", "mavimizdir");
 }
 @Test
 public void PresPart_yAn() {
   Tester tester = new Tester("aramak", "gitmek [A:Voicing, Aorist_A]");
   //
   tester.assertHasParses(
       "gidene", "arayandan", "gitmeyenden", "aramayanı", "aratmayanı", "aranmayanı");
 }
 @Test
 public void stemChange() {
   Tester tester = new Tester("demek [A:StemChange]", "yemek [A:StemChange]");
   tester.assertHasParses(
       "ye", "de", "yeme", "deme", "yiyor", "diyor", "yemiyor", "demiyor", "yedi", "dedi");
   tester.assertUnParseable("yi", "di", "yime", "dime", "yeyor", "deyor", "yemeyor");
 }
 @Test
 public void testPast() {
   Tester tester = new Tester("aramak", "gitmek [A:Voicing, Aorist_A]");
   tester.assertHasParses(
       "aradı", "gitti", "gittik", "gittiyse", "gittim", "gittiniz", "gittiydim");
   tester.assertUnParseable("gittiz", "gittimiş");
 }
 @Test
 public void testDim() {
   // Noun-Noun
   Tester tester = new Tester("armut");
   tester.assertHasParses("armutçuk", "armutçuğu", "armutcağız", "armutcağızı");
   tester.assertUnParseable("armutçuğ", "armutçukcuk", "armutçukcağız", "armutcağızcık");
   // TODO: check oflazer parse "babacım = baba+Noun+A3sg+Pnon+Nom^DB+Noun+Dim+A3sg+P1sg+Nom
 }
 @Test
 public void ability() {
   Tester tester = new Tester("aramak", "gitmek [A:Voicing, Aorist_A]");
   // abil
   tester.assertHasParses(
       "arayabil", "arayabilir", "arayabilecek", "gidebil", "gidebilecek", "gidebiliyor");
   // a
   tester.assertHasParses("arayamıyorum", "arayamaya", "arayamasın", "arayamamaktan", "gidemese");
   tester.assertHasParses(
       "arayamam",
       "arayamazsın",
       "arayamayız",
       "arayama",
       "arayamayabilir",
       "gideme",
       "gidemeyebilir");
 }
 @Test
 public void asif() {
   Tester tester = new Tester("aramak", "gitmek [A:Voicing, Aorist_A]");
   tester.assertHasParses(
       "ararcasına",
       "aramazcasına",
       "arıyormuşçasına",
       "aranılmışçasına",
       "gidebilirmişsinizcesine");
 }
 @Test
 public void testImp() {
   Tester tester = new Tester("aramak", "gitmek [A:Voicing, Aorist_A]", "hapsetmek [A:Voicing]");
   tester.assertHasParses(
       "ara",
       "arayın",
       "git",
       "gitme",
       "gidiniz",
       "gitsene",
       "gitsenize",
       "aramayacak",
       "aramasın",
       "gitmesin",
       "arasınlar",
       "gitmesinler");
   tester.assertHasParses("aramasanıza", "aramayın", "gitmeyin");
   tester.assertUnParseable(suffixProvider.Pass, "hapsedin");
 }
 @Test
 public void FutPart_yAcAK() {
   Tester tester = new Tester("aramak", "gitmek [A:Voicing, Aorist_A]");
   // WithoutDoing_mAdAn
   tester.assertHasParses(
       "gidecekleri",
       "gitmeyeceklere",
       "arayacaklardan",
       "aramayacaklardan",
       "arayamayacaklardan");
 }
 @Test
 public void Des() {
   Tester tester = new Tester("aramak", "gitmek [A:Voicing, Aorist_A]");
   tester.assertHasParses(
       "arasa",
       "arasak",
       "arasalar",
       "aramasalar",
       "aransalar",
       "aratsalar",
       "arattırsak",
       "arattırmasanız");
 }
 // TODO:  "zeytinyağlılarım" gives two identical parse result.
 @Test
 public void testCompounds() {
   Tester tester = new Tester("zeytinyağı [A:CompoundP3sg ;R:zeytinyağ]");
   tester.assertHasParses(
       "zeytinyağcık",
       "zeytinyağım",
       "zeytinyağına",
       "zeytinyağlılar",
       "zeytinyağlılarım",
       "zeytinyağı",
       "zeytinyağcığa",
       "zeytinyağlarım");
   tester.assertUnParseable("zeytinyağılar", "zeytinyağıcık");
 }
 @Test
 public void testNess() {
   Tester tester = new Tester("elma", "mavi [P:Adj]");
   tester.assertHasParses(
       "elmacıktı",
       "elmalık",
       "elmalığı",
       "elmalıktı",
       "elmalığa",
       "mavilik",
       "maviliği",
       "mavilikti");
   tester.assertUnParseable("elmalıka", "maviliki");
 }
 @Test
 public void verbVowelDrop() {
   Tester tester = new Tester("kavurmak [A:LastVowelDrop]");
   tester.assertHasParses(
       "kavurdu",
       "kavuracağız",
       "kavurur",
       "kavuruyor",
       "kavur",
       "kavrul",
       "kavrulma",
       "kavurma",
       "kavrulacağız",
       "kavrulmayıver",
       "kavurtacağız");
   tester.assertUnParseable("kavurul", "kavracağız", "kavruyor", "kavrar", "kavrar");
 }
 @Test
 public void Verb2Adverb() {
   Tester tester = new Tester("aramak", "gitmek [A:Voicing, Aorist_A]");
   // WithoutDoing_mAdAn
   tester.assertHasParses("aramadan", "arayamadan", "gitmeden", "gidemeden");
   // When_yIncA, , UnableToDo_yAmAdAn, ByDoing_yArAk, WithoutDoing_mAdAn, WithoutDoing2_mAksIzIn)
   //                .add(InsteadOfDoing_mAktAnsA, AsLongAs_dIkcA, AfterDoing_yIp
   // SinceDoing_yAlI
   tester.assertHasParses("arayalı", "aramayalı", "gideli", "gitmeyeli");
   // ByDoing_yArAk
   tester.assertHasParses("arayarak", "aramayarak", "giderek", "gitmeyerek");
   // WithoutDoing_mAdAn.
   tester.assertHasParses("aramadan", "gitmeden", "aranmadan", "aratmadan");
   // WithoutDoing2_mAksIzIn
   tester.assertHasParses("aramaksızın", "gitmeksizin", "aranmaksızın");
   // InsteadOfDoing_mAktAnsA
   tester.assertHasParses(
       "aramaktansa", "aramamaktansa", "aranmaktansa", "aratmaktansa", "aranmamaktansa");
   // AsLongAs_dIkcA
   tester.assertHasParses("aradıkça", "aramadıkça", "aranmadıkça", "aratmadıkça", "arayamadıkça");
   // AfterDoing_yIp
   tester.assertHasParses("arayıp", "aramayıp");
 }
 @Test
 public void fitFor() {
   Tester tester = new Tester("elma");
   tester.assertHasParses("elmalık", "elmalığa");
 }
 @Test
 public void testAdj2Verb() {
   Tester tester = new Tester("mavi [P:Adj]");
   tester.assertHasParses("mavileşti", "mavileşmiş", "maviydi", "maviyim");
   tester.assertHasParses("mavilendi", "mavilendir");
 }
 @Test
 public void testNounToVerbCopular() {
   Tester tester = new Tester("elma");
   tester.assertHasParses("elmaydı", "elmaymış", "elmaydık", "elmayım", "elmadır");
 }
 @Test
 public void Agt() {
   Tester tester = new Tester("aramak", "gitmek [A:Voicing, Aorist_A]");
   tester.assertHasParses("arayıcı", "gidici");
 }
 @Test
 public void AgtNoun() {
   Tester tester = new Tester("elma", "armut");
   tester.assertHasParses(
       "elmacı", "armutçu", "elmacılar", "elmacısın", "elmacısınız", "elmacıyız", "elmacılık");
 }
 // TODO elmalidir should have single parse
 @Test
 public void testWithAndWithout() {
   Tester tester = new Tester("elma", "kitap");
   tester.assertHasParses("elmalı", "elmasız", "kitaplı", "kitapsız", "elmalıydı", "elmalıdır");
   tester.assertUnParseable("elmayalı", "elmalarlı", "elmadasız", "elmalarsız");
 }
 @Test
 public void testCompoundsVoicing() {
   Tester tester = new Tester("atkuyruğu [A:CompoundP3sg, Voicing ; R:atkuyruk]");
   tester.assertHasParses("atkuyrukçuk", "atkuyruğu", "atkuyruklarım");
   tester.assertUnParseable("atkuyruğlarım", "atkuyruk");
 }