public void TestDivide() { var prim = PrimitiveFactory.Get("/"); ScheminDecimal test_decimal = new ScheminDecimal(3.0m); ScheminInteger test_integer = new ScheminInteger(3); ScheminInteger test_divisor_int = new ScheminInteger(2); ScheminDecimal test_divisor_decimal = new ScheminDecimal(2); ScheminList decimal_args = new ScheminList(test_decimal); decimal_args.Append(test_divisor_decimal); ScheminList int_args = new ScheminList(test_integer); int_args.Append(test_divisor_int); ScheminList mixed_args = new ScheminList(test_integer); mixed_args.Append(test_divisor_decimal); ScheminDecimal decimal_result = (ScheminDecimal) prim.Execute(null, null, decimal_args); ScheminInteger int_result = (ScheminInteger) prim.Execute(null, null, int_args); ScheminDecimal mixed_result = (ScheminDecimal) prim.Execute(null, null, mixed_args); ScheminInteger expected = new ScheminInteger(1); Assert.AreEqual(1.5m, decimal_result.DecimalValue()); Assert.AreEqual(expected.IntegerValue(), int_result.IntegerValue()); Assert.AreEqual(1.5m, mixed_result.DecimalValue()); }
public void TestAdd() { var prim = PrimitiveFactory.Get("+"); ScheminDecimal test_decimal = new ScheminDecimal(1.5m); ScheminInteger test_integer = new ScheminInteger(2); ScheminPair decimal_args = new ScheminPair(test_decimal); decimal_args = decimal_args.Append(test_decimal); ScheminPair int_args = new ScheminPair(test_integer); int_args = int_args.Append(test_integer); ScheminPair mixed_args = new ScheminPair(test_integer); mixed_args = mixed_args.Append(test_decimal); ScheminDecimal decimal_result = (ScheminDecimal) prim.Execute(null, null, decimal_args); ScheminInteger int_result = (ScheminInteger) prim.Execute(null, null, int_args); ScheminDecimal mixed_result = (ScheminDecimal) prim.Execute(null, null, mixed_args); ScheminInteger expected = new ScheminInteger(4); Assert.AreEqual(3.0m, decimal_result.DecimalValue()); Assert.AreEqual(expected.IntegerValue(), int_result.IntegerValue()); Assert.AreEqual(3.5m, mixed_result.DecimalValue()); }
public override IScheminType Execute(Environment env, Evaluator eval, ScheminPair args) { bool dec = false; var first = (IScheminNumeric) args.Car; IScheminNumeric result = null; foreach (IScheminType type in args) { if ((type as ScheminDecimal) != null) { dec = true; result = new ScheminDecimal(first.DecimalValue()); } } if (!dec) { result = new ScheminInteger(first.IntegerValue()); } if (args.Length < 2) { if (dec) { return new ScheminDecimal(first.DecimalValue() * -1); } else { return new ScheminInteger(first.IntegerValue() * -1); } } foreach (IScheminType type in args.ListCdr()) { if ((type as IScheminNumeric) != null) { var temp = (IScheminNumeric) type; if (dec) { result = new ScheminDecimal(result.DecimalValue() - temp.DecimalValue()); } else { result = new ScheminInteger(result.IntegerValue() - temp.IntegerValue()); } } } return (IScheminType) result; }
public void TestSubtract() { var prim = PrimitiveFactory.Get("-"); ScheminDecimal test_decimal = new ScheminDecimal(8.5m); ScheminInteger test_integer = new ScheminInteger(20); ScheminDecimal test_decimal_2 = new ScheminDecimal(4.1m); ScheminInteger test_integer_2 = new ScheminInteger(6); ScheminList decimal_args = new ScheminList(test_decimal); decimal_args.Append(test_decimal_2); ScheminList int_args = new ScheminList(test_integer); int_args.Append(test_integer_2); ScheminList mixed_args = new ScheminList(test_integer); mixed_args.Append(test_decimal); ScheminDecimal decimal_result = (ScheminDecimal) prim.Execute(null, null, decimal_args); ScheminInteger int_result = (ScheminInteger) prim.Execute(null, null, int_args); ScheminDecimal mixed_result = (ScheminDecimal) prim.Execute(null, null, mixed_args); ScheminInteger expected = new ScheminInteger(14); Assert.AreEqual(4.4m, decimal_result.DecimalValue()); Assert.AreEqual(expected.IntegerValue(), int_result.IntegerValue()); Assert.AreEqual(11.5m, mixed_result.DecimalValue()); }
public void TestMultiply() { var prim = PrimitiveFactory.Get("*"); ScheminDecimal test_decimal = new ScheminDecimal(1.5m); ScheminInteger test_integer = new ScheminInteger(2); ScheminInteger test_mult_int = new ScheminInteger(6); ScheminDecimal test_mult_decimal = new ScheminDecimal(0.8m); ScheminInteger test_large = new ScheminInteger(BigInteger.Parse("100000000000000000000000000000000")); ScheminInteger test_large_2nd = new ScheminInteger(BigInteger.Parse("400000000000000000000")); ScheminList decimal_args = new ScheminList(test_decimal); decimal_args.Append(test_mult_decimal); ScheminList int_args = new ScheminList(test_integer); int_args.Append(test_mult_int); ScheminList mixed_args = new ScheminList(test_integer); mixed_args.Append(test_mult_decimal); ScheminList large_args = new ScheminList(test_large); large_args.Append(test_large_2nd); ScheminDecimal decimal_result = (ScheminDecimal) prim.Execute(null, null, decimal_args); ScheminInteger int_result = (ScheminInteger) prim.Execute(null, null, int_args); ScheminDecimal mixed_result = (ScheminDecimal) prim.Execute(null, null, mixed_args); ScheminInteger large_result = (ScheminInteger) prim.Execute(null, null, large_args); ScheminInteger expected = new ScheminInteger(12); ScheminInteger exp_large = new ScheminInteger(BigInteger.Parse("40000000000000000000000000000000000000000000000000000")); Assert.AreEqual(1.2m, decimal_result.DecimalValue()); Assert.AreEqual(expected.IntegerValue(), int_result.IntegerValue()); Assert.AreEqual(1.6m, mixed_result.DecimalValue()); Assert.AreEqual(exp_large.IntegerValue(), large_result.IntegerValue()); }