public void ErlVarTest() { var t = ErlVar.Any; Assert.IsFalse(t.Equals(new ErlVar(ConstAtoms.ANY))); Assert.AreEqual(ConstAtoms.ANY, t.Name); Assert.AreEqual(ErlTypeOrder.ErlObject, t.ValueType); t = new ErlVar(N, ErlTypeOrder.ErlLong); Assert.AreEqual("N", t.Name.Value); Assert.AreEqual(ErlTypeOrder.ErlLong, t.ValueType); { var bind = new ErlVarBind(); Assert.IsTrue(t.Match(new ErlByte(10), bind)); Assert.AreEqual(10, bind["N"].ValueAsLong); bind.Clear(); var q = new ErlVar("N", ErlTypeOrder.ErlByte); Assert.IsTrue(q.Match(new ErlLong(111), bind)); Assert.AreEqual(111, bind["N"].ValueAsLong); } Assert.IsFalse(t.Matches(new ErlVar())); Assert.IsFalse(new ErlVar(A).Matches(new ErlVar(A))); Assert.IsFalse(new ErlVar(A).Matches(new ErlVar(B))); Assert.AreEqual(new ErlVarBind { { N, (ErlLong)10 } }, t.Match((ErlLong)10)); Assert.AreEqual(new ErlVarBind { { A, (ErlLong)10 } }, new ErlVar(A).Match((ErlLong)10)); Assert.AreEqual(-1, new ErlAtom("ok").CompareTo(t)); Assert.Throws<ErlIncompatibleTypesException>(() => { var x = t.ValueAsObject; }); Assert.Throws<ErlIncompatibleTypesException>(() => { var x = t.ValueAsInt; }); Assert.Throws<ErlIncompatibleTypesException>(() => { var x = t.ValueAsLong; }); Assert.Throws<ErlIncompatibleTypesException>(() => { var x = t.ValueAsDecimal; }); Assert.Throws<ErlIncompatibleTypesException>(() => { var x = t.ValueAsDateTime; }); Assert.Throws<ErlIncompatibleTypesException>(() => { var x = t.ValueAsTimeSpan; }); Assert.Throws<ErlIncompatibleTypesException>(() => { var x = t.ValueAsDouble; }); Assert.Throws<ErlIncompatibleTypesException>(() => { var x = t.ValueAsString; }); Assert.Throws<ErlIncompatibleTypesException>(() => { var x = t.ValueAsBool; }); Assert.Throws<ErlIncompatibleTypesException>(() => { var x = t.ValueAsChar; }); Assert.Throws<ErlIncompatibleTypesException>(() => { var x = t.ValueAsByteArray; }); Assert.AreEqual("N::int()", t.ToString()); Assert.IsTrue(t.IsScalar); Assert.AreEqual(ErlTypeOrder.ErlVar, t.TypeOrder); IErlObject temp = null; Assert.IsFalse(t.Subst(ref temp, new ErlVarBind { { M, new ErlLong(100) } })); Assert.IsTrue(t.Subst(ref temp, new ErlVarBind { { N, new ErlLong(100) } })); Assert.AreEqual(new ErlLong(100), temp); temp = new ErlVar(M, ErlTypeOrder.ErlLong); Assert.IsTrue(temp.Subst(ref temp, new ErlVarBind { { M, new ErlLong(100) } })); Assert.AreEqual(ErlTypeOrder.ErlVar, t.Visit(ErlTypeOrder.ErlByte, (acc, o) => ((ErlVar)o).TypeOrder)); Assert.AreEqual(new ErlLong(100), temp); temp = new ErlVar(N, ErlTypeOrder.ErlObject); Assert.IsTrue(temp.Subst(ref temp, new ErlVarBind { { N, new ErlLong(100) } })); // Invalid variable type temp = new ErlVar(N, ErlTypeOrder.ErlAtom); Assert.Throws<ErlException>(() => temp.Subst(ref temp, new ErlVarBind { { N, new ErlLong(100) } })); }