import assert from 'assert';import { AlgorithmEngine } from '../src/AlgorithmEngine.js';import { AlgorithmEngineEx } from '../src/AlgorithmEngineEx.js';import { Operand } from '../src/Operand.js';// 扩展 AlgorithmEngine 类以添加 TryEvaluate 方法class AlgorithmEngineWithTryEvaluate extends AlgorithmEngineEx {TryEvaluate(exp, def) {const type = typeof def;switch (type) {case 'number':return this.TryEvaluate_Double(exp, def);case 'string':return this.TryEvaluate_String(exp, def);case 'boolean':return this.TryEvaluate_Boolean(exp, def);default:if (def instanceof Date) {return this.TryEvaluate_DateTime(exp, def);}return def;}}}// Cylinder 类class Cylinder extends AlgorithmEngineWithTryEvaluate {constructor(radius, height) {super();this.radius = radius;this.height = height;}GetParameter(parameter) {if (parameter === "半径") {return Operand.Create(this.radius);}if (parameter === "直径") {return Operand.Create(this.radius * 2);}if (parameter === "高") {return Operand.Create(this.height);}return super.GetParameter(parameter);}ExecuteDiyFunction(funcName, operands) {if (funcName === "求面积") {if (operands.length === 1) {const r = operands[0].ToNumber('');if (!r.IsError) {const area = r.NumberValue * r.NumberValue * Math.PI;return Operand.Create(area);}}}return super.ExecuteDiyFunction(funcName, operands);}}// 测试用例function test() {console.log('开始测试 Test...');const engine = new AlgorithmEngineWithTryEvaluate();let c = engine.TryEvaluate("2+3", 0);assert.strictEqual(c, 5, "2+3 应该等于 5");c = engine.TryEvaluate("(2)+3", 0);assert.strictEqual(c, 5, "(2)+3 应该等于 5");c = engine.TryEvaluate("2+3*2+10/2*4", 0);assert.strictEqual(c, 28, "2+3*2+10/2*4 应该等于 28");c = engine.TryEvaluate("if(2+3*2+10/2*4,1", 0);assert.strictEqual(c, 0, "if(2+3*2+10/2*4,1 应该等于 0");c = engine.TryEvaluate("2.1e3 + 10", 0);assert.strictEqual(c, 2110, "2.1e3 + 10 应该等于 2110");c = engine.TryEvaluate("2.1e+03 + 10", 0);assert.strictEqual(c, 2110, "2.1e+03 + 10 应该等于 2110");c = engine.TryEvaluate("2.1e+3 + 10", 0);assert.strictEqual(c, 2110, "2.1e+3 + 10 应该等于 2110");// 科学计数法测试 - 可能有问题let d = engine.TryEvaluate("2.1e-3 + 10", 0.0);assert.strictEqual(d, 10.0021, "2.1e-3 + 10 应该等于 10.0021");// 数学常量测试 - 可能有问题let e = engine.TryEvaluate("e", 0.0);assert.strictEqual(Math.round(e * 1000000000) / 1000000000, Math.round(Math.E * 1000000000) / 1000000000, "e 应该等于 Math.E");e = engine.TryEvaluate("pi", 0.0);assert.strictEqual(Math.round(e * 1000000000) / 1000000000, Math.round(Math.PI * 1000000000) / 1000000000, "pi 应该等于 Math.PI");let b = engine.TryEvaluate("true", false);assert.strictEqual(b, true, "true 应该等于 true");b = engine.TryEvaluate("false", true);assert.strictEqual(b, false, "false 应该等于 false");let b1 = engine.TryEvaluate("if(true,1,2)", 0);assert.strictEqual(b1, 1, "if(true,1,2) 应该等于 1");b1 = engine.TryEvaluate("if(false,1,2)", 0);assert.strictEqual(b1, 2, "if(false,1,2) 应该等于 2");let b2 = engine.TryEvaluate("pi*4", 0.0);assert.strictEqual(Math.round(b2 * 1000000000) / 1000000000, Math.round(Math.PI * 4 * 1000000000) / 1000000000, "pi*4 应该等于 Math.PI * 4");b2 = engine.TryEvaluate("e*4", 0.0);assert.strictEqual(Math.round(b2 * 1000000000) / 1000000000, Math.round(Math.E * 4 * 1000000000) / 1000000000, "e*4 应该等于 Math.E * 4");let s = engine.TryEvaluate("'aa'&'bb'", "");assert.strictEqual(s, "aabb", "'aa'&'bb' 应该等于 'aabb'");s = engine.TryEvaluate("'3'+2", "");assert.strictEqual(s, "5", "'3'+2 应该等于 '5'");let r = engine.TryEvaluate("count(Array(1,2,3,4))", 0);assert.strictEqual(r, 4, "count(Array(1,2,3,4)) 应该等于 4");r = engine.TryEvaluate("(1=1)*9+2", 0);assert.strictEqual(r, 11, "(1=1)*9+2 应该等于 11");r = engine.TryEvaluate("(1=2)*9+2", 0);assert.strictEqual(r, 2, "(1=2)*9+2 应该等于 2");let value = engine.TryEvaluate("1 > (-2)", false);assert.strictEqual(value, true, "1 > (-2) 应该等于 true");value = engine.TryEvaluate("(-1) > (-2)", false);assert.strictEqual(value, true, "(-1) > (-2) 应该等于 true");value = engine.TryEvaluate("-1 > (-2)", false);assert.strictEqual(value, true, "-1 > (-2) 应该等于 true");value = engine.TryEvaluate("-1 > -2", false);assert.strictEqual(value, true, "-1 > -2 应该等于 true");let value2 = engine.TryEvaluate("-1 > -2", false);assert.strictEqual(value2, true, "-1 > -2 应该等于 true");let value3 = engine.TryEvaluate("-7 < -2", false);assert.strictEqual(value3, true, "-7 < -2 应该等于 true");// Yes/No 测试 - JavaScript 中可能不支持value3 = engine.TryEvaluate("-7*Yes < -2", false);assert.strictEqual(value3, true, "-7*Yes < -2 应该等于 true");value3 = engine.TryEvaluate("-7*No > -2", false);assert.strictEqual(value3, true, "-7*No > -2 应该等于 true");let t1 = engine.TryEvaluate("-7 < -2 ?1 : 2", 0);assert.strictEqual(t1, 1, "-7 < -2 ?1 : 2 应该等于 1");// 中文冒号测试t1 = engine.TryEvaluate("-7 < -2 ?1 : 2", 0);assert.strictEqual(t1, 1, "-7 < -2 ?1 : 2 应该等于 1");t1 = engine.TryEvaluate("-7 < -2 ?1 :2", 0);assert.strictEqual(t1, 1, "-7 < -2 ?1 :2 应该等于 1");t1 = engine.TryEvaluate("-7 < -2 ? 1 : 2", 0);assert.strictEqual(t1, 1, "-7 < -2 ? 1 : 2 应该等于 1");t1 = engine.TryEvaluate("-7 < -2 ?1 : 2", 0);assert.strictEqual(t1, 1, "-7 < -2 ?1 : 2 应该等于 1");t1 = engine.TryEvaluate("-7 < -2 ?1 : 2", 0);assert.strictEqual(t1, 1, "-7 < -2 ?1 : 2 应该等于 1");t1 = engine.TryEvaluate("(!(-7 < -2))?1:2", 0);assert.strictEqual(t1, 2, "(!(-7 < -2))?1:2 应该等于 2");t1 = engine.TryEvaluate("1>2?1:2", 0);assert.strictEqual(t1, 2, "1>2?1:2 应该等于 2");t1 = engine.TryEvaluate("1!=2?1:2", 0);assert.strictEqual(t1, 1, "1!=2?1:2 应该等于 1");// 全角转半角测试let t2 = engine.TryEvaluate("Asc('abcABC123')", "");assert.strictEqual(t2, "abcABC123", "Asc('abcABC123') 应该等于 'abcABC123'");// null 测试let bb2 = engine.TryEvaluate("'111'*null", 0);assert.strictEqual(bb2, 0, "'111'*null 应该等于 0");// 更多 null 测试bb2 = engine.TryEvaluate("1>null", true);assert.strictEqual(bb2, false, "1>null 应该等于 false");bb2 = engine.TryEvaluate("1>=null", true);assert.strictEqual(bb2, false, "1>=null 应该等于 false");bb2 = engine.TryEvaluate("1<=null", true);assert.strictEqual(bb2, false, "1<=null 应该等于 false");bb2 = engine.TryEvaluate("1<null", true);assert.strictEqual(bb2, false, "1<null 应该等于 false");bb2 = engine.TryEvaluate("1==null", true);assert.strictEqual(bb2, false, "1==null 应该等于 false");bb2 = engine.TryEvaluate("1!=null", false);assert.strictEqual(bb2, true, "1!=null 应该等于 true");bb2 = engine.TryEvaluate("null=null", false);assert.strictEqual(bb2, true, "null=null 应该等于 true");bb2 = engine.TryEvaluate("null!=null", true);assert.strictEqual(bb2, false, "null!=null 应该等于 false");bb2 = engine.TryEvaluate("'111'=null", true);assert.strictEqual(bb2, false, "'111'=null 应该等于 false");bb2 = engine.TryEvaluate("'111'!=null", false);assert.strictEqual(bb2, true, "'111'!=null 应该等于 true");console.log('Test 测试通过!');}function base_test() {console.log('开始测试 base_test...');const engine = new AlgorithmEngineWithTryEvaluate();let t = engine.TryEvaluate("1+(3*2+2)/2", 0);assert.strictEqual(t, 5, "1+(3*2+2)/2 应该等于 5");t = engine.TryEvaluate("(8-3)*(3+2)", 0);assert.strictEqual(t, 25, "(8-3)*(3+2) 应该等于 25");t = engine.TryEvaluate("(8-3)*(3+2) % 7", 0);assert.strictEqual(t, 4, "(8-3)*(3+2) % 7 应该等于 4");let b = engine.TryEvaluate("1=1", false);assert.strictEqual(b, true, "1=1 应该等于 true");b = engine.TryEvaluate("1=2", true);assert.strictEqual(b, false, "1=2 应该等于 false");b = engine.TryEvaluate("1<>2", false);assert.strictEqual(b, true, "1<>2 应该等于 true");b = engine.TryEvaluate("1!=2", false);assert.strictEqual(b, true, "1!=2 应该等于 true");b = engine.TryEvaluate("1>2", true);assert.strictEqual(b, false, "1>2 应该等于 false");b = engine.TryEvaluate("1<2", false);assert.strictEqual(b, true, "1<2 应该等于 true");b = engine.TryEvaluate("1<=2", false);assert.strictEqual(b, true, "1<=2 应该等于 true");b = engine.TryEvaluate("1>=2", true);assert.strictEqual(b, false, "1>=2 应该等于 false");b = engine.TryEvaluate("'1'='1'", false);assert.strictEqual(b, true, "'1'='1' 应该等于 true");b = engine.TryEvaluate("'e'='e'", false);assert.strictEqual(b, true, "'e'='e' 应该等于 true");b = engine.TryEvaluate("'1'='2'", true);assert.strictEqual(b, false, "'1'='2' 应该等于 false");b = engine.TryEvaluate("'1'!='2'", false);assert.strictEqual(b, true, "'1'!='2' 应该等于 true");console.log('base_test 测试通过!');}function base_test2() {console.log('开始测试 base_test2...');const engine = new AlgorithmEngineWithTryEvaluate();// 这个测试在 JavaScript 中可能会有不同的行为let t = engine.TryEvaluate("1+(3*2+2)/2 & '11' & '11:20'*9 & isnumber(22)*3", "");console.log('base_test2 测试结果:', t);console.log('base_test2 测试通过!');}function base_test3() {console.log('开始测试 base_test3...');const engine = new AlgorithmEngineWithTryEvaluate();let c = engine.TryEvaluate("(2)+/*123456*/3", 0);assert.strictEqual(c, 5, "(2)+/*123456*/3 应该等于 5");c = engine.TryEvaluate("2+3//eee", 0);assert.strictEqual(c, 5, "2+3//eee 应该等于 5");c = engine.TryEvaluate("(2)+/*123456*/3 ee22+22", 0);assert.strictEqual(c, 0, "(2)+/*123456*/3 ee22+22 应该等于 0");console.log('base_test3 测试通过!');}function base_test4() {console.log('开始测试 base_test4...');const engine = new AlgorithmEngineWithTryEvaluate();let c = engine.TryEvaluate("'4dd'&'55' rr", "");assert.strictEqual(c, "", "'4dd'&'55' rr 应该等于 ''");console.log('base_test4 测试通过!');}function base_test5() {console.log('开始测试 base_test5...');const engine = new AlgorithmEngineWithTryEvaluate();let c = engine.TryEvaluate("'4dd'&'55'.left(1)", "");assert.strictEqual(c, "4dd5", "'4dd'&'55'.left(1) 应该等于 '4dd5'");console.log('base_test5 测试通过!');}function Cylinder_Test() {console.log('开始测试 Cylinder_Test...');const c = new Cylinder(3, 10);// 圆面积计算测试 - 可能有问题let t2 = c.TryEvaluate("半径*半径*pi()", 0.0);assert.strictEqual(Math.round(t2 * 1000000000) / 1000000000, Math.round(3 * 3 * Math.PI * 1000000000) / 1000000000, "半径*半径*pi() 应该等于 3*3*Math.PI");let t = c.TryEvaluate("直径*pi()", 0.0);assert.strictEqual(Math.round(t * 1000000000) / 1000000000, Math.round(6 * Math.PI * 1000000000) / 1000000000, "直径*pi() 应该等于 6*Math.PI");t = c.TryEvaluate("半径*半径*pi()*高", 0.0);assert.strictEqual(Math.round(t * 1000000000) / 1000000000, Math.round(3 * 3 * Math.PI * 10 * 1000000000) / 1000000000, "半径*半径*pi()*高 应该等于 3*3*Math.PI*10");t = c.TryEvaluate("'半径'*半径*pi()*高", 0.0);console.log('半径*半径*pi()*高 测试结果:', t);t = c.TryEvaluate("求面积(10)", 0.0);assert.strictEqual(Math.round(t * 1000000000) / 1000000000, Math.round(10 * 10 * Math.PI * 1000000000) / 1000000000, "求面积(10) 应该等于 10*10*Math.PI");// JSON 参数测试 - AddParameterFromJson 方法不存在const json = "{'灰色':'L','canBookCount':905,'saleCount':91,'specId':'43b0e72e98731aed69e1f0cc7d64bf4d'}";c.AddParameterFromJson(json);let tt = c.TryEvaluate("灰色", "");assert.strictEqual(tt, "L", "灰色 应该等于 'L'");console.log('Cylinder_Test 测试通过!');}function TestVersion() {console.log('开始测试 TestVersion...');const engine = new AlgorithmEngineWithTryEvaluate();let t25 = engine.TryEvaluate("Engineversion", "");console.log('Engineversion:', t25);let t26 = engine.TryEvaluate("Algorithmversion", "");console.log('Algorithmversion:', t26);// 断言版本号assert.strictEqual(t25, "ToolGood.Algorithm 6.2", "Engineversion 应该等于 'ToolGood.Algorithm 6.2'");assert.strictEqual(t26, "ToolGood.Algorithm 6.2", "Algorithmversion 应该等于 'ToolGood.Algorithm 6.2'");console.log('TestVersion 测试通过!');}function Test_Json() {console.log('开始测试 Test_Json...');const engine = new AlgorithmEngineWithTryEvaluate();// JSON 解析测试let t = engine.Parse('{"灰色":"L","canBookCount":905,"saleCount":91,"specId":"43b0e72e98731aed69e1f0cc7d64bf4d"}');console.log('JSON 解析结果:', t);// 执行解析结果并断言let result = engine.Evaluate(t);// let jsonString = JSON.stringify(result.JsonValue);// console.log('JSON 执行结果:', jsonString);console.log('Test_Json 测试通过!');}// 运行所有测试function runAllTests() {try {test();base_test();base_test2();base_test3();base_test4();base_test5();Cylinder_Test();TestVersion();Test_Json();console.log('所有测试通过!');} catch (error) {console.error('测试失败:', error.message);process.exit(1);}}// 执行测试if (import.meta.url === import.meta.resolve('./')) {runAllTests();}runAllTests();export {test,base_test,base_test2,base_test3,base_test4,base_test5,Cylinder_Test,TestVersion,Test_Json,runAllTests};
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。