refactor rule evaluator to make use of expr envs

This commit is contained in:
Héctor Giménez
2024-05-06 10:15:37 +09:00
parent 8315e55594
commit ffac5edff5
5 changed files with 170 additions and 114 deletions

View File

@@ -36,6 +36,7 @@ func TestRule_Evaluate(t *testing.T) {
},
args: args{
item: data.Item{
ID: 603,
Name: "SmAlLCharM",
Quality: item.QualityMagic,
Ethereal: true,
@@ -57,6 +58,7 @@ func TestRule_Evaluate(t *testing.T) {
},
args: args{
item: data.Item{
ID: 373,
Name: "mageplate",
Quality: item.QualitySuperior,
Ethereal: false,
@@ -76,6 +78,7 @@ func TestRule_Evaluate(t *testing.T) {
},
args: args{
item: data.Item{
ID: 373,
Name: "mageplate",
Stats: []stat.Data{
{ID: stat.AddClassSkills, Value: 3, Layer: 1},
@@ -92,6 +95,7 @@ func TestRule_Evaluate(t *testing.T) {
},
args: args{
item: data.Item{
ID: 373,
Name: "mageplate",
Stats: []stat.Data{
{ID: stat.SingleSkill, Value: 3, Layer: 55},
@@ -100,20 +104,6 @@ func TestRule_Evaluate(t *testing.T) {
},
want: RuleResultFullMatch,
},
{
name: "Ensure [color] returns error, not supported yet",
fields: fields{
RawLine: "[type] == armor && [color] == 1000 && [quality] == magic",
Enabled: true,
},
args: args{
item: data.Item{
Name: "mageplate",
Quality: item.QualityMagic,
},
},
wantErr: true,
},
{
name: "Unid item matching base stats should return partial match",
fields: fields{
@@ -122,6 +112,7 @@ func TestRule_Evaluate(t *testing.T) {
},
args: args{
item: data.Item{
ID: 373,
Identified: false,
Name: "mageplate",
Quality: item.QualityMagic,
@@ -137,6 +128,7 @@ func TestRule_Evaluate(t *testing.T) {
},
args: args{
item: data.Item{
ID: 373,
Identified: false,
Name: "mageplate",
Quality: item.QualityMagic,
@@ -174,7 +166,7 @@ func TestRule_Evaluate(t *testing.T) {
Identified: true,
ID: 0,
Name: "handaxe",
Quality: item.QualityUnique,
Quality: item.QualitySuperior,
Stats: []stat.Data{},
},
},
@@ -202,7 +194,7 @@ func TestRule_Evaluate(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
r, err := New(tt.fields.RawLine, tt.fields.Filename, tt.fields.LineNumber)
r, err := NewRule(tt.fields.RawLine, tt.fields.Filename, tt.fields.LineNumber)
require.NoError(t, err)
got, err := r.Evaluate(tt.args.item)
if !tt.wantErr {
@@ -234,10 +226,17 @@ func TestNew(t *testing.T) {
},
wantErr: true,
},
{
name: "Ensure [color] returns error, not supported yet",
args: args{
rawRule: "[type] == armor && [color] == 1000 && [quality] == magic",
},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := New(tt.args.rawRule, tt.args.filename, tt.args.lineNumber)
got, err := NewRule(tt.args.rawRule, tt.args.filename, tt.args.lineNumber)
if tt.wantErr {
require.Error(t, err)
} else {
@@ -247,3 +246,22 @@ func TestNew(t *testing.T) {
})
}
}
func BenchmarkEvaluate(b *testing.B) {
it := data.Item{
ID: 0,
Name: "Axe",
Quality: item.QualitySuperior,
}
rule, err := NewRule(
"[type] == amulet && [quality] == crafted # ([shapeshiftingskilltab] >= 2 || [elementalskilltab] >= 2 || [druidsummoningskilltab] >= 2) && [fcr] >= 10 && ([strength]+[maxhp]+[maxmana] >= 60 || [dexterity]+[maxhp]+[maxmana] >= 60 || [strength]+[dexterity]+[maxhp] >= 50 || [strength]+[dexterity]+[maxmana] >= 55)",
"test",
1,
)
require.NoError(b, err)
for n := 0; n < b.N; n++ {
rule.Evaluate(it)
}
}