using System.Linq; using HeuristicLab.Algorithms.DataAnalysis.SymRegGrammarEnumeration; using HeuristicLab.Algorithms.DataAnalysis.SymRegGrammarEnumeration.GrammarEnumeration; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Test { [TestClass] public class TreeHashingTest { private Grammar grammar; private TerminalSymbol varA; private TerminalSymbol varB; private TerminalSymbol varC; [TestInitialize] public void InitTest() { grammar = new Grammar(new[] { "a", "b", "c" }); varA = grammar.Var.VariableTerminalSymbols.First(s => s.StringRepresentation == "a"); varB = grammar.Var.VariableTerminalSymbols.First(s => s.StringRepresentation == "b"); varC = grammar.Var.VariableTerminalSymbols.First(s => s.StringRepresentation == "c"); } [TestMethod] [TestCategory("TreeHashing")] public void SimpleEqualityAddition() { SymbolString s1 = new SymbolString(new[] { varA, varB, grammar.Addition, varC, grammar.Addition }); SymbolString s2 = new SymbolString(new[] { varA, varB, grammar.Addition, varC, grammar.Addition }); int hash1 = grammar.CalcHashCode(s1); int hash2 = grammar.CalcHashCode(s2); Assert.AreEqual(hash1, hash2); } [TestMethod] [TestCategory("TreeHashing")] public void SimpleInequalityAddition() { SymbolString s1 = new SymbolString(new[] { varA, varB, grammar.Addition, varC, grammar.Addition }); SymbolString s2 = new SymbolString(new[] { varB, varB, grammar.Addition, varB, grammar.Addition }); int hash1 = grammar.CalcHashCode(s1); int hash2 = grammar.CalcHashCode(s2); Assert.AreNotEqual(hash1, hash2); } [TestMethod] [TestCategory("TreeHashing")] public void CommutativityAddition() { SymbolString s1 = new SymbolString(new[] { varA, varB, grammar.Addition }); SymbolString s2 = new SymbolString(new[] { varB, varA, grammar.Addition }); int hash1 = grammar.CalcHashCode(s1); int hash2 = grammar.CalcHashCode(s2); Assert.AreEqual(hash1, hash2); } [TestMethod] [TestCategory("TreeHashing")] public void AssociativityAddition() { SymbolString s1 = new SymbolString(new[] { varA, varB, grammar.Addition, varA, grammar.Addition }); SymbolString s2 = new SymbolString(new[] { varA, varB, varA, grammar.Addition, grammar.Addition }); int hash1 = grammar.CalcHashCode(s1); int hash2 = grammar.CalcHashCode(s2); Assert.AreEqual(hash1, hash2); } [TestMethod] [TestCategory("TreeHashing")] public void RepeatedAddition() { SymbolString s1 = new SymbolString(new[] { varA, varA, grammar.Addition, varA, grammar.Addition }); SymbolString s2 = new SymbolString(new[] { varA }); int hash1 = grammar.CalcHashCode(s1); int hash2 = grammar.CalcHashCode(s2); Assert.AreEqual(hash1, hash2); } } }