// LUCENENET specific - De-nested RandomAcceptedStrings /// <summary> /// Return a random NFA/DFA for testing. </summary> public static Automaton RandomAutomaton(Random random) { // get two random Automata from regexps Automaton a1 = (new RegExp(AutomatonTestUtil.RandomRegexp(random), RegExpSyntax.NONE)).ToAutomaton(); if (random.NextBoolean()) { a1 = BasicOperations.Complement(a1); } Automaton a2 = (new RegExp(AutomatonTestUtil.RandomRegexp(random), RegExpSyntax.NONE)).ToAutomaton(); if (random.NextBoolean()) { a2 = BasicOperations.Complement(a2); } // combine them in random ways switch (random.Next(4)) { case 0: return(BasicOperations.Concatenate(a1, a2)); case 1: return(BasicOperations.Union(a1, a2)); case 2: return(BasicOperations.Intersection(a1, a2)); default: return(BasicOperations.Minus(a1, a2)); } }
private static void AssertAutomaton(Automaton a) { Automaton clone = (Automaton)a.Clone(); // complement(complement(a)) = a Automaton equivalent = BasicOperations.Complement(BasicOperations.Complement(a)); Assert.IsTrue(BasicOperations.SameLanguage(a, equivalent)); // a union a = a equivalent = BasicOperations.Union(a, clone); Assert.IsTrue(BasicOperations.SameLanguage(a, equivalent)); // a intersect a = a equivalent = BasicOperations.Intersection(a, clone); Assert.IsTrue(BasicOperations.SameLanguage(a, equivalent)); // a minus a = empty Automaton empty = BasicOperations.Minus(a, clone); Assert.IsTrue(BasicOperations.IsEmpty(empty)); // as long as don't accept the empty string // then optional(a) - empty = a if (!BasicOperations.Run(a, "")) { //System.out.println("test " + a); Automaton optional = BasicOperations.Optional(a); //System.out.println("optional " + optional); equivalent = BasicOperations.Minus(optional, BasicAutomata.MakeEmptyString()); //System.out.println("equiv " + equivalent); Assert.IsTrue(BasicOperations.SameLanguage(a, equivalent)); } }
/// <summary> /// See <see cref="BasicOperations.Intersection(Automaton, Automaton)"/>. /// </summary> public virtual Automaton Intersection(Automaton a) { return(BasicOperations.Intersection(this, a)); }