public void Equals_NullY_ReturnsFalse() { var stateA = new SubstitutionAction { ReplacedGlyphCount = 2, ReplacementGlyphIds = new ushort[] { 3, 4 } }; Assert.IsFalse(this.GetComparer().Equals(stateA, null)); }
public void Equals_SubstitutionActionEqualActions_ReturnsTrue() { var comparer = this.GetComparer(); var stateA = new SubstitutionAction { ReplacedGlyphCount = 2, ReplacementGlyphIds = new ushort[] { 1, 2 } }; var stateB = new SubstitutionAction { ReplacedGlyphCount = 2, ReplacementGlyphIds = new ushort[] { 1, 2 } }; var result = comparer.Equals(stateA, stateB); Assert.IsTrue(result); }
public void Equals_SubstitutionActionDifferentReplacedGlyphCounts_ReturnsFalse() { var comparer = this.GetComparer(); var stateA = new SubstitutionAction { ReplacedGlyphCount = 2, SkippedGlyphCount = 1, ReplacementGlyphIds = new ushort[] { 1, 2 } }; var stateB = new SubstitutionAction { ReplacedGlyphCount = 3, SkippedGlyphCount = 1, ReplacementGlyphIds = new ushort[] { 1, 2 } }; var result = comparer.Equals(stateA, stateB); Assert.IsFalse(result); }
protected void CompileSubstitutionAppendingFromMachine(uint featureId, SubstitutionAppendix substitution, GlyphClassesAppendix glyphClasses, StateMachine machine) { Debug.Assert(machine.States[0] == machine.EntryState, "First state is not the entry state."); SubstitutionAppendix.Feature feature = new SubstitutionAppendix.Feature(); checked { for (ushort requiredState = 0; requiredState < machine.States.Count; requiredState++) { var state = machine.States[requiredState]; foreach (var transition in state.Transitions) { SubstitutionAppendix.Rule rule = new SubstitutionAppendix.Rule(); rule.RequiredState = requiredState; rule.NewState = (ushort)machine.States.IndexOf(transition.TargetState); if (transition is AlwaysTransition) { rule.Condition = SubstitutionAppendix.RuleCondition.Unconditional; } else if (transition is SimpleTransition) { rule.Condition = SubstitutionAppendix.RuleCondition.Glyph; rule.ConditionParameter = ((SimpleTransition)transition).GlyphId; } else if (transition is SetTransition) { SetTransition setTransition = (SetTransition)transition; int[] glyphs = setTransition.GlyphIdSet.Select(id => (int)id).ToArray(); GlyphClassesAppendix.Coverage coverage = glyphClasses.FindCoverage(glyphs); if (coverage == null) { coverage = glyphClasses.AppendCoverage(glyphs); } if (!glyphClasses.Coverages.Contains(coverage)) { glyphClasses.Coverages.Add(coverage); } rule.Condition = SubstitutionAppendix.RuleCondition.GlyphClass; rule.ConditionParameter = (ushort)glyphClasses.Coverages.IndexOf(coverage); } else { Debug.Assert(false, "Unknown condition: " + transition.GetType()); continue; } if (transition.Action == null) { rule.Action = SubstitutionAppendix.RuleAction.Nothing; } else { SubstitutionAction action = transition.Action as SubstitutionAction; if (action == null) { Debug.Assert(false, "Unknown action: " + transition.Action.GetType()); continue; } int replacementGlyphCount = action.ReplacementGlyphIds.Count(); if (replacementGlyphCount == 1 && action.ReplacedGlyphCount <= 3) { if (action.ReplacedGlyphCount == 0) { rule.Action = SubstitutionAppendix.RuleAction.GlyphInsertion; } else if (action.ReplacedGlyphCount == 1) { rule.Action = SubstitutionAppendix.RuleAction.GlyphOverwrite; } else if (action.ReplacedGlyphCount == 2) { rule.Action = SubstitutionAppendix.RuleAction.GlyphRewrite_2_1; } else if (action.ReplacedGlyphCount == 3) { rule.Action = SubstitutionAppendix.RuleAction.GlyphRewrite_3_1; } else { Debug.Assert(false, "Unknown action: " + action); continue; } rule.ActionParameter = action.ReplacementGlyphIds.First(); } else if (replacementGlyphCount == 0) { rule.Action = SubstitutionAppendix.RuleAction.GlyphDeletion; rule.ActionParameter = (ushort)action.ReplacedGlyphCount; } else { rule.Action = SubstitutionAppendix.RuleAction.GlyphRewrite_N_M; rule.ActionParameter = substitution.AppendParameters(new SubstitutionAppendix.GlyphRewriteParameters((byte)action.ReplacedGlyphCount, action.ReplacementGlyphIds.Select(g => (int)g).ToArray())); } rule.ActionOffset = (sbyte)(1 - action.SkippedGlyphCount - action.ReplacedGlyphCount); rule.TapeMovement = (sbyte)action.SkippedGlyphCount; } rule.TapeMovement += (sbyte)(transition.HeadShift); feature.Rules.Add(rule); } } } substitution.Features.Add(feature); substitution.FeatureOffsets.Add(new SubstitutionAppendix.FeatureOffset { Tag = featureId }); }