From 220b1d269d034a107c1a578a4f249b57bb90981c Mon Sep 17 00:00:00 2001 From: zhiqiang feng Date: Thu, 31 Dec 2020 17:57:24 +0800 Subject: [PATCH] basic test --- go.mod | 7 ++++- go.sum | 14 +++++++++- parser/telegram.go | 62 ++++++++++++++++++++++++++++++++++++++--- parser/telegram_test.go | 52 ++++++++++++++++++++++++++++++++++ 4 files changed, 129 insertions(+), 6 deletions(-) create mode 100644 parser/telegram_test.go diff --git a/go.mod b/go.mod index 3f887f2..4058019 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,9 @@ module it2000.com.cn/tele-proc go 1.15 -require github.com/urfave/cli/v2 v2.3.0 // indirect +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/stretchr/testify v1.6.1 + github.com/urfave/cli/v2 v2.3.0 + gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect +) diff --git a/go.sum b/go.sum index 041fd5c..ed8ed87 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,25 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/urfave/cli v1.22.5 h1:lNq9sAHXK2qfdI8W+GRItjCEkI+2oR4d+MEHy1CKXoU= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/parser/telegram.go b/parser/telegram.go index aec4817..2281189 100644 --- a/parser/telegram.go +++ b/parser/telegram.go @@ -1,22 +1,44 @@ package parser -import "strings" +import ( + "regexp" + "strconv" + "strings" +) type Telegram struct { Text string Complete bool Parsed bool Fields []string - Sequence uint16 + Sequence int + Type string } -const Start = "ZCZC" -const End = "NNN" + + +const ( + Start = "ZCZC" + End = "NNNN" + TmqRegex = `TMQ(?P\d{4})` + FlopRegex = `^\((?P\w{3})-.*` + + TypePLN = "PLN" +) //Parse func Parse(text string) (*Telegram, error) { var telegram = &Telegram{Text: text} telegram.Complete = isStartAndEnd(text) + telegram.Fields = strings.Split(strings.Replace(text, "\r\n", "\n", -1), "\n") + telegram.Fields = clean(telegram.Fields) + seq := getFields(TmqRegex, telegram.Fields[0]) + telegram.Sequence, _ = strconv.Atoi( seq["tmq"]) + if isPln(*telegram) { + telegram.Type = TypePLN + } else if t := getFields(FlopRegex, telegram.Fields[3]); t != nil { + telegram.Type = t["flop"] + } return telegram, nil } @@ -24,3 +46,35 @@ func isStartAndEnd(s string) bool { text := strings.TrimSpace(s) return strings.HasPrefix(text, Start) && strings.HasSuffix(text, End) } + +func clean(fields []string) []string { + var values []string + for _, s := range fields { + values = append(values, strings.TrimSpace(s)) + } + return values[:len(values)-1] +} + + +func getFields(regEx, field string) (fields map[string]string) { + + var compRegEx = regexp.MustCompile(regEx) + match := compRegEx.FindStringSubmatch(field) + + fields = make(map[string]string) + for i, name := range compRegEx.SubexpNames() { + if i > 0 && i <= len(match) { + fields[name] = match[i] + } + } + return +} + +func isPln(telegram Telegram) bool { + for _, value := range telegram.Fields { + if strings.HasPrefix(value, TypePLN) { + return true + } + } + return false +} diff --git a/parser/telegram_test.go b/parser/telegram_test.go new file mode 100644 index 0000000..a88cb40 --- /dev/null +++ b/parser/telegram_test.go @@ -0,0 +1,52 @@ +package parser + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestBasicFlop(t *testing.T) { + ast := assert.New(t) + s :=`ZCZC TMQ2526 141605 +FF ZBTJZPZX +141604 ZBACZQZX +(ARR-JAE7433/A0132-RKSI-ZBTJ1604) +NNNN` + tele, err := Parse(s) + ast.Nil(err, "Should be no error") + ast.Equal(tele.Complete, true, "Should be complete telegram") + ast.Equal(4, len(tele.Fields), "get 4 lines") + ast.Equal("ZCZC TMQ2526 141605", tele.Fields[0]) + ast.Equal(2526, tele.Sequence, "TMQ must be 2526") + ast.Equal(false, tele.Type == "PLN", "Not a plan") + ast.Equal("ARR", tele.Type, "Flop type is ARR") +} + +func TestBasicPln(t *testing.T) { + ast := assert.New(t) + + s := `ZCZC TMQ2886 142347 +QU TSNZPCA +. +QU WUHZPCA WUHTZ8X TSNZPCA TSNTZCR FOCZPCA FOCTZMF XIYZPCA XIYKL8X +KWLZPCA KWLTF8X CANZPCA CANUOCZ CANKNCZ +.XMNUOMF 142346 +PLN +15MAY +01) MF8138 B5162 ILS(8) TSN0010 0155WUH0245 0355FOC +02) MF8323 B5308 ILS(8) TSN0625 0810XIY0910 1050KWL +03) MF8324 B5308 ILS(8) KWL1135 1315XIY1405 1535TSN +04) MF8347 B5162 ILS(8) FOC0650 0815CAN +05) MF8348 B5162 ILS(8) CAN0920 1050FOC +SI:A/C CHG += +NNNN` + tele, err := Parse(s) + ast.Nil(err, "Should be no error") + ast.Equal(tele.Complete, true, "Should be complete telegram") + ast.Equal(15, len(tele.Fields), "get 15 lines") + ast.Equal("ZCZC TMQ2886 142347", tele.Fields[0]) + ast.Equal(2886, tele.Sequence, "TMQ must be 2886") + ast.Equal(true, tele.Type == "PLN", "This is a plan") + +} \ No newline at end of file