Skip to content

Commit a8ed284

Browse files
committed
添加单元测试
1 parent ba98a3b commit a8ed284

File tree

7 files changed

+264
-54
lines changed

7 files changed

+264
-54
lines changed

README.md

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ ToolGood.Algorithm支持`四则运算`、`Excel公式`,并支持`自定义参数
3636
}
3737
var b = engine.TryEvaluate("1=1 && 1<2 and 7-8>1", 0);// Support(支持) && || and or
3838
var c = engine.TryEvaluate("2+3", 0);
39-
var d = engine.TryEvaluate("count({1,2,3,4})", 0);//{} represents array, return: 4 {}代表数组,返回:4
39+
var e = engine.TryEvaluate("count(array(1,2,3,4))", 0);//{} represents array, return: 4 {}代表数组,返回:4
4040
var s = engine.TryEvaluate("'aa'&'bb'", ""); //String connection, return: AABB 字符串连接,返回:aabb
4141
var r = engine.TryEvaluate("(1=1)*9+2", 0); //Return: 11 返回:11
4242
var d = engine.TryEvaluate("'2016-1-1'+1", DateTime.MinValue); //Return date: 2016-1-2 返回日期:2016-1-2
@@ -124,6 +124,36 @@ Note: You can also use `AddParameter`, `AddParameterFromJson` to add methods, an
124124

125125
注:还可以使用`AddParameter``AddParameterFromJson`添加方法,使用`DiyFunction`+=来自定义函数。
126126

127+
## Multi formula (多公式)
128+
``` csharp
129+
ConditionCache multiConditionCache = new ConditionCache();
130+
multiConditionCache.LazyLoad = true;
131+
multiConditionCache.AddFormula("桌面积", "[圆桌]", "[半径]*[半径]*pi()");
132+
multiConditionCache.AddFormula("桌面积", "[方桌]", "[长]*[宽]");
133+
multiConditionCache.AddFormula("价格", "[圆桌]&& [半径]<2.5", "[桌面积]*1.3");
134+
multiConditionCache.AddFormula("价格", "[圆桌]&& [半径]<5", "[桌面积]*1.5");
135+
multiConditionCache.AddFormula("价格", "[圆桌]&& [半径]<7", "[桌面积]*2");
136+
multiConditionCache.AddFormula("价格", "[圆桌]", "[桌面积]*2.5");
137+
multiConditionCache.AddFormula("价格", "[方桌]&& [长]<1.3", "[桌面积]*1.3+[高]*1.1");
138+
multiConditionCache.AddFormula("价格", "[方桌]&& [长]<2", "[桌面积]*1.5+[高]*1.1");
139+
multiConditionCache.AddFormula("价格", "[方桌]&& [长]<5", "[桌面积]*2+[高]*1.1");
140+
multiConditionCache.AddFormula("价格", "[方桌]&& [长]<7", "[桌面积]*2.5");
141+
142+
var algoEngine = new ToolGood.Algorithm.AlgorithmEngineEx(multiConditionCache);
143+
algoEngine.JumpConditionError = true;
144+
algoEngine.AddParameter("方桌", true);
145+
algoEngine.AddParameter("", 3);
146+
algoEngine.AddParameter("", 1.3);
147+
algoEngine.AddParameter("", 1);
148+
149+
var p2 = algoEngine.TryEvaluate("价格", 0.0);
150+
Assert.AreEqual(3 * 1.3 * 2 + 1 * 1.1, p2, 0.0001);
151+
```
152+
See unit testing for more features.
153+
154+
更多功能请看一下单元测试。
155+
156+
127157
## Excel Formula (Excel公式)
128158

129159
Functions: `logical functions`, `mathematics and trigonometric functions`, `text functions`, `statistical functions`, `date and time functions`

csharp/ToolGood.Algorithm2.Test/AlgorithmEngineEx/AlgorithmEngineExTest.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,33 @@ public void Test3()
142142
Assert.AreEqual("3", p1);
143143
}
144144

145+
[Test]
146+
public void Test4()
147+
{
148+
ConditionCache multiConditionCache = new ConditionCache();
149+
multiConditionCache.LazyLoad = true;
150+
multiConditionCache.AddFormula("桌面积", "[圆桌]", "[半径]*[半径]*pi()");
151+
multiConditionCache.AddFormula("桌面积", "[方桌]", "[长]*[宽]");
152+
multiConditionCache.AddFormula("价格", "[圆桌]&& [半径]<2.5", "[桌面积]*1.3");
153+
multiConditionCache.AddFormula("价格", "[圆桌]&& [半径]<5", "[桌面积]*1.5");
154+
multiConditionCache.AddFormula("价格", "[圆桌]&& [半径]<7", "[桌面积]*2");
155+
multiConditionCache.AddFormula("价格", "[圆桌]", "[桌面积]*2.5");
156+
multiConditionCache.AddFormula("价格", "[方桌]&& [长]<1.3", "[桌面积]*1.3+[高]*1.1");
157+
multiConditionCache.AddFormula("价格", "[方桌]&& [长]<2", "[桌面积]*1.5+[高]*1.1");
158+
multiConditionCache.AddFormula("价格", "[方桌]&& [长]<5", "[桌面积]*2+[高]*1.1");
159+
multiConditionCache.AddFormula("价格", "[方桌]&& [长]<7", "[桌面积]*2.5");
145160

161+
var algoEngine = new ToolGood.Algorithm.AlgorithmEngineEx(multiConditionCache);
162+
algoEngine.JumpConditionError = true;
163+
algoEngine.AddParameter("方桌", true);
164+
algoEngine.AddParameter("长", 3);
165+
algoEngine.AddParameter("宽", 1.3);
166+
algoEngine.AddParameter("高", 1);
167+
168+
var p2 = algoEngine.TryEvaluate("价格", 0.0);
169+
Assert.AreEqual(3 * 1.3 * 2 + 1 * 1.1, p2, 0.0001);
170+
171+
}
146172

147173
}
148174

csharp/ToolGood.Algorithm2.Test/Program.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,23 @@ class Program
1111
static void Main(string[] args)
1212
{
1313
AlgorithmEngine engine = new AlgorithmEngine();
14+
double a = 0.0;
15+
if (engine.Parse("1+2")) {
16+
var o = engine.Evaluate();
17+
a = o.NumberValue;
18+
}
19+
var b = engine.TryEvaluate("1=1 && 1<2 and 7-8>1", 0);// Support(支持) && || and or
20+
var c = engine.TryEvaluate("2+3", 0);
21+
var d = engine.TryEvaluate("count(array(1,2,3,4))", 0);//{} represents array, return: 4 {}代表数组,返回:4
22+
var s = engine.TryEvaluate("'aa'&'bb'", ""); //String connection, return: AABB 字符串连接,返回:aabb
23+
var r = engine.TryEvaluate("(1=1)*9+2", 0); //Return: 11 返回:11
24+
var e = engine.TryEvaluate("'2016-1-1'+1", DateTime.MinValue); //Return date: 2016-1-2 返回日期:2016-1-2
25+
var t = engine.TryEvaluate("'2016-1-1'+9*'1:0'", DateTime.MinValue);//Return datetime:2016-1-1 9:0 返回日期:2016-1-1 9:0
26+
var j = engine.TryEvaluate("json('{\"Name\":\"William Shakespeare\",\"Age\":51,\"Birthday\":\"04/26/1564 00:00:00\"}').Age", null);//Return 51 返回51
27+
var k = engine.TryEvaluate("json('{\"Name\":\"William Shakespeare \",\"Age\":51,\"Birthday\":\"04/26/1564 00:00:00\"}')[Name].Trim()", null);//Return to "William Shakespeare" 返回"William Shakespeare" (不带空格)
28+
var l = engine.TryEvaluate("json('{\"Name1\":\"William Shakespeare \",\"Age\":51,\"Birthday\":\"04/26/1564 00:00:00\"}')['Name'& 1].Trim().substring(2,3)", null); ;//Return "ill" 返回"ill"
1429

15-
double t = 0.0;
16-
//if (engine.Parse("1+2[][]")) {
17-
// t = (double)engine.Evaluate().NumberValue;
18-
//}
30+
1931

2032
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
2133
Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");

csharp/ToolGood.Algorithm2/AlgorithmEngineEx.cs

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,16 @@ public class AlgorithmEngineEx
2727
/// 自定义 函数
2828
/// </summary>
2929
public event Func<string, List<Operand>, Operand> DiyFunction;
30+
private ConditionCache MultiConditionCache;
3031
/// <summary>
31-
/// 多条件缓存
32+
/// 跳过条件错误
3233
/// </summary>
33-
public ConditionCache MultiConditionCache { get; private set; }
34+
public bool JumpConditionError { get; set; }
35+
/// <summary>
36+
/// 跳过公式错误
37+
/// </summary>
38+
public bool JumpFormulaError { get; set; }
39+
3440

3541
public AlgorithmEngineEx(ConditionCache multiConditionCache)
3642
{
@@ -55,17 +61,22 @@ protected virtual Operand GetParameter(string parameter)
5561
if (conditionCache.ConditionProg != null) {
5662
var b = Evaluate(conditionCache.ConditionProg);
5763
if (b.IsError) {
58-
return Operand.Error($"Parameter [{parameter}],{conditionCache.Remark} condition `{conditionCache.ConditionString}` is error.\r\n{b.ErrorMsg}");
64+
LastError = $"Parameter [{parameter}],{conditionCache.Remark} condition `{conditionCache.ConditionString}` is error.\r\n{b.ErrorMsg}";
65+
if (JumpConditionError) continue;
66+
return Operand.Error(LastError);
5967
}
6068
if (b.BooleanValue == false) continue;
6169
}
6270
operand = Evaluate(conditionCache.FormulaProg);
6371
if (operand.IsError) {
64-
operand = Operand.Error($"Parameter [{parameter}],{conditionCache.Remark} formula `{conditionCache.FormulaString}` is error.\r\n{operand.ErrorMsg}");
72+
LastError = $"Parameter [{parameter}],{conditionCache.Remark} formula `{conditionCache.FormulaString}` is error.\r\n{operand.ErrorMsg}";
73+
if (JumpFormulaError) continue;
74+
return Operand.Error(LastError);
6575
}
6676
_dict[parameter] = operand;
6777
return operand;
6878
}
79+
if (LastError != null) return Operand.Error(LastError);
6980
return Operand.Error($"Parameter [{parameter}] is missing.");
7081
}
7182
#endregion
@@ -102,6 +113,7 @@ public void ClearDiyFunctions()
102113
/// <returns></returns>
103114
public Operand Evaluate(string categoryName)
104115
{
116+
LastError = null;
105117
Operand operand;
106118
var conditionCaches = MultiConditionCache.GetConditionCaches(categoryName);
107119
foreach (var conditionCache in conditionCaches) {
@@ -112,7 +124,9 @@ public Operand Evaluate(string categoryName)
112124
}
113125
var b = Evaluate(conditionCache.ConditionProg);
114126
if (b.IsError) {
115-
return Operand.Error($"CategoryName [{categoryName}],{conditionCache.Remark} condition `{conditionCache.ConditionString}` is error.\r\n{b.ErrorMsg}");
127+
LastError = $"CategoryName [{categoryName}],{conditionCache.Remark} condition `{conditionCache.ConditionString}` is error.\r\n{b.ErrorMsg}";
128+
if (JumpConditionError) continue;
129+
return Operand.Error(LastError);
116130
}
117131
if (b.BooleanValue == false) continue;
118132
}
@@ -121,10 +135,13 @@ public Operand Evaluate(string categoryName)
121135
}
122136
operand = Evaluate(conditionCache.FormulaProg);
123137
if (operand.IsError) {
124-
operand = Operand.Error($"CategoryName [{categoryName}],{conditionCache.Remark} formula `{conditionCache.FormulaString}` is error.\r\n{operand.ErrorMsg}");
138+
LastError = $"CategoryName [{categoryName}],{conditionCache.Remark} formula `{conditionCache.FormulaString}` is error.\r\n{operand.ErrorMsg}";
139+
if (JumpFormulaError) continue;
140+
operand = Operand.Error(LastError);
125141
}
126142
return operand;
127143
}
144+
if (LastError != null) return Operand.Error(LastError);
128145
return Operand.Error($"CategoryName [{categoryName}] is missing.");
129146

130147
}
@@ -137,6 +154,7 @@ public Operand Evaluate(string categoryName)
137154
/// <exception cref="Exception"></exception>
138155
public string SearchRemark(string categoryName)
139156
{
157+
LastError = null;
140158
var conditionCaches = MultiConditionCache.GetConditionCaches(categoryName);
141159
foreach (var conditionCache in conditionCaches) {
142160
if (string.IsNullOrEmpty(conditionCache.ConditionString) == false) {
@@ -145,12 +163,15 @@ public string SearchRemark(string categoryName)
145163
}
146164
var b = Evaluate(conditionCache.ConditionProg);
147165
if (b.IsError) {
148-
throw new Exception($"CategoryName [{categoryName}],{conditionCache.Remark} condition `{ conditionCache.ConditionString}` is error.\r\n{b.ErrorMsg}");
166+
LastError = $"CategoryName [{categoryName}],{conditionCache.Remark} condition `{conditionCache.ConditionString}` is error.\r\n{b.ErrorMsg}";
167+
if (JumpConditionError) continue;
168+
throw new Exception(LastError);
149169
}
150170
if (b.BooleanValue == false) continue;
151171
}
152172
return conditionCache.Remark;
153173
}
174+
if (LastError != null) new Exception(LastError);
154175
throw new Exception($"CategoryName [{categoryName}] is missing.");
155176
}
156177

0 commit comments

Comments
 (0)