@Test
 public void shouldInsertVowel_A_WithHarmony() {
   final SuffixFormSequence.SuffixFormSequenceRuleType RULE_TYPE =
       SuffixFormSequence.SuffixFormSequenceRuleType.INSERT_VOWEL_A_WITH_HARMONY;
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes = ImmutableSet.of();
     assertThat(applier.apply(rule, phoneticAttributes), equalTo('a'));
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes =
         ImmutableSet.of(PhoneticAttribute.LastVowelBack);
     assertThat(applier.apply(rule, phoneticAttributes), equalTo('a'));
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes =
         ImmutableSet.of(PhoneticAttribute.LastVowelFrontal);
     assertThat(applier.apply(rule, phoneticAttributes), equalTo('e'));
   }
 }
 @Test
 public void shouldInsertOptionalConsonant() {
   final SuffixFormSequence.SuffixFormSequenceRuleType RULE_TYPE =
       SuffixFormSequence.SuffixFormSequenceRuleType.INSERT_OPTIONAL_CONSONANT;
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub('k', RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes = ImmutableSet.of();
     assertThat(applier.apply(rule, phoneticAttributes), nullValue());
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub('l', RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes =
         ImmutableSet.of(PhoneticAttribute.LastLetterConsonant);
     assertThat(applier.apply(rule, phoneticAttributes), nullValue());
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub('m', RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes =
         ImmutableSet.of(PhoneticAttribute.LastLetterVowel);
     assertThat(applier.apply(rule, phoneticAttributes), equalTo('m'));
   }
 }
 @Test
 public void shouldApplySimpleRules() {
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(
             'm', SuffixFormSequence.SuffixFormSequenceRuleType.INSERT_NONVOWEL_LETTER);
     ImmutableSet<PhoneticAttribute> phoneticAttributes = mock(ImmutableSet.class);
     assertThat(applier.apply(rule, phoneticAttributes), equalTo('m'));
     verifyZeroInteractions(phoneticAttributes);
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(
             'a', SuffixFormSequence.SuffixFormSequenceRuleType.INSERT_VOWEL_WITHOUT_HARMONY);
     ImmutableSet<PhoneticAttribute> phoneticAttributes = mock(ImmutableSet.class);
     assertThat(applier.apply(rule, phoneticAttributes), equalTo('a'));
     verifyZeroInteractions(phoneticAttributes);
   }
 }
 @Test
 public void shouldInsertVowel_I_WithHarmony_ButNoRounding() {
   final SuffixFormSequence.SuffixFormSequenceRuleType RULE_TYPE =
       SuffixFormSequence.SuffixFormSequenceRuleType.INSERT_VOWEL_I_WITH_HARMONY_AND_NO_ROUNDING;
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes = ImmutableSet.of();
     assertThat(applier.apply(rule, phoneticAttributes), equalTo('ı'));
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes =
         ImmutableSet.of(PhoneticAttribute.LastVowelBack);
     assertThat(applier.apply(rule, phoneticAttributes), equalTo('ı'));
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes =
         ImmutableSet.of(PhoneticAttribute.LastVowelFrontal);
     assertThat(applier.apply(rule, phoneticAttributes), equalTo('i'));
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes =
         ImmutableSet.of(PhoneticAttribute.LastVowelRounded);
     assertThat(applier.apply(rule, phoneticAttributes), equalTo('ı'));
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes =
         ImmutableSet.of(PhoneticAttribute.LastVowelBack, PhoneticAttribute.LastVowelRounded);
     assertThat(applier.apply(rule, phoneticAttributes), equalTo('ı'));
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes =
         ImmutableSet.of(PhoneticAttribute.LastVowelFrontal, PhoneticAttribute.LastVowelRounded);
     assertThat(applier.apply(rule, phoneticAttributes), equalTo('i'));
   }
 }
 @Test
 public void shouldInsertOptionalVowel_I_WithHarmony() {
   final SuffixFormSequence.SuffixFormSequenceRuleType RULE_TYPE =
       SuffixFormSequence.SuffixFormSequenceRuleType.INSERT_OPTIONAL_VOWEL_I_WITH_HARMONY;
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes = ImmutableSet.of();
     assertThat(applier.apply(rule, phoneticAttributes), nullValue());
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes =
         ImmutableSet.of(PhoneticAttribute.LastVowelBack);
     assertThat(applier.apply(rule, phoneticAttributes), nullValue());
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes =
         ImmutableSet.of(PhoneticAttribute.LastVowelFrontal);
     assertThat(applier.apply(rule, phoneticAttributes), nullValue());
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes =
         ImmutableSet.of(PhoneticAttribute.LastVowelRounded);
     assertThat(applier.apply(rule, phoneticAttributes), nullValue());
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes =
         ImmutableSet.of(PhoneticAttribute.LastVowelBack, PhoneticAttribute.LastVowelRounded);
     assertThat(applier.apply(rule, phoneticAttributes), nullValue());
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes =
         ImmutableSet.of(PhoneticAttribute.LastVowelFrontal, PhoneticAttribute.LastVowelRounded);
     assertThat(applier.apply(rule, phoneticAttributes), nullValue());
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes =
         ImmutableSet.of(PhoneticAttribute.LastLetterConsonant);
     assertThat(applier.apply(rule, phoneticAttributes), equalTo('ı'));
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes =
         ImmutableSet.of(PhoneticAttribute.LastLetterConsonant, PhoneticAttribute.LastVowelBack);
     assertThat(applier.apply(rule, phoneticAttributes), equalTo('ı'));
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes =
         ImmutableSet.of(
             PhoneticAttribute.LastLetterConsonant, PhoneticAttribute.LastVowelFrontal);
     assertThat(applier.apply(rule, phoneticAttributes), equalTo('i'));
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes =
         ImmutableSet.of(
             PhoneticAttribute.LastLetterConsonant, PhoneticAttribute.LastVowelRounded);
     assertThat(applier.apply(rule, phoneticAttributes), equalTo('u'));
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes =
         ImmutableSet.of(
             PhoneticAttribute.LastLetterConsonant,
             PhoneticAttribute.LastVowelBack,
             PhoneticAttribute.LastVowelRounded);
     assertThat(applier.apply(rule, phoneticAttributes), equalTo('u'));
   }
   {
     final SuffixFormSequence.SuffixFormSequenceRule rule =
         new SuffixFormSequenceRuleStub(RULE_TYPE);
     ImmutableSet<PhoneticAttribute> phoneticAttributes =
         ImmutableSet.of(
             PhoneticAttribute.LastLetterConsonant,
             PhoneticAttribute.LastVowelFrontal,
             PhoneticAttribute.LastVowelRounded);
     assertThat(applier.apply(rule, phoneticAttributes), equalTo('ü'));
   }
 }