public void TestFormatVariable() { var cases = new Dictionary <string, Erlang.TermType> { { "B", Erlang.TermType.Object }, { "B::int()", Erlang.TermType.Int }, { "B::integer()", Erlang.TermType.Int }, { "B::string()", Erlang.TermType.String }, { "B::atom()", Erlang.TermType.Atom }, { "B::float()", Erlang.TermType.Double }, { "B::double()", Erlang.TermType.Double }, { "B::binary()", Erlang.TermType.Binary }, { "B::bool()", Erlang.TermType.Boolean }, { "B::boolean()", Erlang.TermType.Boolean }, { "B::byte()", Erlang.TermType.Byte }, { "B::char()", Erlang.TermType.Char }, { "B::list()", Erlang.TermType.List }, { "B::tuple()", Erlang.TermType.Tuple }, { "B::pid()", Erlang.TermType.Pid }, { "B::ref()", Erlang.TermType.Ref }, { "B::reference()", Erlang.TermType.Ref }, { "B::port()", Erlang.TermType.Port } }; foreach (var p in cases) { Erlang.Object o = Erlang.Object.Format(p.Key); Assert.IsInstanceOf(typeof(Erlang.Var), o); Assert.AreEqual(p.Value, o.Cast <Erlang.Var>().VarTermType); } var pat1 = Erlang.Object.Format("{A::char(), B::tuple(), C::float(), D::list(), [E::string(), F::int()], G::bool()}"); var obj1 = Erlang.Object.Format("{$a, {1,2,3}, 10.0, [5,6], [\"abc\", 190], true}"); var binding = new Erlang.VarBind(); Assert.IsTrue(pat1.match(obj1, binding)); // Match unbound variables Assert.IsTrue(pat1.match(obj1, binding)); // Match bound variables var obj2 = Erlang.Object.Format("{$a, {1,2,3}, 20.0, [5,6], [\"abc\", 190], true}"); Assert.IsFalse(pat1.match(obj2, binding)); // Match bound variables binding.clear(); var obj3 = Erlang.Object.Format("{$a, {1,2,3}, 10.0, [5,6], [\"abc\", bad], false}"); Assert.IsFalse(pat1.match(obj3, binding)); }
/// <summary> /// Match a term against the patterns in the collection. /// The first successful match will result in invokation of the action /// associated with the pattern /// </summary> /// <param name="term">Term to match against patterns</param> /// <returns>ID of the pattern that matched, or -1 if there were no matches</returns> public int Match <TErlTerm>(TErlTerm term, params object[] args) where TErlTerm : ErlObject { var binding = new VarBind(); foreach (var p in m_patterns) { if (p.Term.match(term, binding)) { p.Action(p, term, binding, args); return(p.ID); } binding.clear(); } return(-1); }