From d37b8014777a37bffbc07fdd03e4ec49bfccfa23 Mon Sep 17 00:00:00 2001 From: debugtalk Date: Wed, 29 Sep 2021 12:49:54 +0800 Subject: [PATCH] change: use data driven test --- parser.go | 2 +- parser_test.go | 183 ++++++++++++++++++++----------------------------- 2 files changed, 76 insertions(+), 109 deletions(-) diff --git a/parser.go b/parser.go index f7b75efc..e3800de7 100644 --- a/parser.go +++ b/parser.go @@ -70,7 +70,7 @@ func parseString(raw string, variablesMapping map[string]interface{}) interface{ remainedString = remainedString[startPosition:] // search variable like ${var} or $var - varMatched := regexCompileVariable.FindStringSubmatch(raw[matchStartPosition:]) + varMatched := regexCompileVariable.FindStringSubmatch(remainedString) if len(varMatched) == 3 { var varName string if varMatched[1] != "" { diff --git a/parser_test.go b/parser_test.go index 1fe47010..1de295aa 100644 --- a/parser_test.go +++ b/parser_test.go @@ -42,115 +42,82 @@ func TestParseDataStringWithVariables(t *testing.T) { "_v": 6.9, // variable name starts with underscore } - // no variable - if !assert.Equal(t, "var_1", parseData("var_1", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "$", parseData("$", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "var_1$", parseData("var_1$", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "var_1$123", parseData("var_1$123", variablesMapping)) { // variable should starts with a letter - t.Fail() + testData := []struct { + expr string + expect interface{} + }{ + // no variable + {"var_1", "var_1"}, + {"$", "$"}, + {"var_1$", "var_1$"}, + {"var_1$123", "var_1$123"}, // variable should starts with a letter + // single variable + {"$var_1", "abc"}, + {"${var_1}", "abc"}, + {"$var_3", 123}, + {"$var_4", map[string]interface{}{"a": 1}}, + {"${var_4}", map[string]interface{}{"a": 1}}, + {"$var_5", true}, + {"$var_6", nil}, + {"$v", 4.5}, + {"var_1$_v", "var_16.9"}, + // single variable with prefix or suffix + {"$var_1#XYZ", "abc#XYZ"}, + {"${var_1}#XYZ", "abc#XYZ"}, + {"ABC$var_1", "ABCabc"}, + {"ABC${var_1}", "ABCabc"}, + {"ABC$var_1/", "ABCabc/"}, + {"ABC${v}/", "ABC4.5/"}, + // multiple variables + {"/$var_1/$var_2/var3", "/abc/def/var3"}, + {"/${var_1}/$var_2/var3", "/abc/def/var3"}, + {"ABC$var_1$var_3", "ABCabc123"}, + {"ABC$var_1${var_3}", "ABCabc123"}, + {"ABC$var_1/$var_3", "ABCabc/123"}, + {"ABC${var_1}/${var_3}", "ABCabc/123"}, + {"ABC$var_1/123$var_1/456", "ABCabc/123abc/456"}, + {"ABC$var_1/123${var_1}/456", "ABCabc/123abc/456"}, + {"ABC$var_1/$var_2/$var_1", "ABCabc/def/abc"}, + {"ABC$var_1/$var_2/${var_1}", "ABCabc/def/abc"}, + {"func1($var_1, $var_3)", "func1(abc, 123)"}, + {"func1($var_1, ${var_3})", "func1(abc, 123)"}, + // TODO: fix compatibility with python version + {"abc$var_4", "abcmap[a:1]"}, // "abc{'a': 1}" + {"abc$var_5", "abctrue"}, // "abcTrue" + {"/api/$SECRET_KEY", "/api/"}, // raise error } - // single variable - if !assert.Equal(t, "abc", parseData("$var_1", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "abc", parseData("${var_1}", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, 123, parseData("$var_3", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, map[string]interface{}{"a": 1}, parseData("$var_4", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, map[string]interface{}{"a": 1}, parseData("${var_4}", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, true, parseData("$var_5", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, nil, parseData("$var_6", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, 4.5, parseData("$v", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "var_16.9", parseData("var_1$_v", variablesMapping)) { - t.Fail() - } - - // single variable with prefix or suffix - if !assert.Equal(t, "abc#XYZ", parseData("$var_1#XYZ", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "abc#XYZ", parseData("${var_1}#XYZ", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "ABCabc", parseData("ABC$var_1", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "ABCabc", parseData("ABC${var_1}", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "ABCabc/", parseData("ABC$var_1/", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "ABC4.5/", parseData("ABC${v}/", variablesMapping)) { - t.Fail() - } - - // multiple variables - if !assert.Equal(t, "/abc/def/var3", parseData("/$var_1/$var_2/var3", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "/abc/def/var3", parseData("/${var_1}/$var_2/var3", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "ABCabc123", parseData("ABC$var_1$var_3", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "ABCabc123", parseData("ABC$var_1${var_3}", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "ABCabc/123", parseData("ABC$var_1/$var_3", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "ABCabc/123", parseData("ABC${var_1}/${var_3}", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "ABCabc/123abc/456", parseData("ABC$var_1/123$var_1/456", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "ABCabc/123abc/456", parseData("ABC$var_1/123${var_1}/456", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "ABCabc/def/abc", parseData("ABC$var_1/$var_2/$var_1", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "ABCabc/def/abc", parseData("ABC$var_1/$var_2/${var_1}", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "func1(abc, 123)", parseData("func1($var_1, $var_3)", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "func1(abc, 123)", parseData("func1($var_1, ${var_3})", variablesMapping)) { - t.Fail() - } - - // TODO: fix compatibility with python version, "abc{'a': 1}" - if !assert.Equal(t, "abcmap[a:1]", parseData("abc$var_4", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "abctrue", parseData("abc$var_5", variablesMapping)) { - t.Fail() - } - if !assert.Equal(t, "/api/", parseData("/api/$SECRET_KEY", variablesMapping)) { - t.Fail() + for _, data := range testData { + if !assert.Equal(t, data.expect, parseData(data.expr, variablesMapping)) { + t.Fail() + } + } +} +func TestParseDataStringWithVariablesAbnormal(t *testing.T) { + variablesMapping := map[string]interface{}{ + "var_1": "abc", + "var_2": "def", + "var_3": 123, + "var_4": map[string]interface{}{"a": 1}, + "var_5": true, + "var_6": nil, + "v": 4.5, // variable name with one character + "_v": 6.9, // variable name starts with underscore + } + + testData := []struct { + expr string + expect interface{} + }{ + {"ABC$var_1{", "ABCabc{"}, + {"{ABC$var_1{}a}", "{ABCabc{}a}"}, + {"AB{C$var_1{}a}", "AB{Cabc{}a}"}, + {"ABC$var_1}", "ABCabc}"}, + } + + for _, data := range testData { + if !assert.Equal(t, data.expect, parseData(data.expr, variablesMapping)) { + t.Fail() + } } }