示例#1
0
        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) }
            }));
        }