basic test
This commit is contained in:
+58
-4
@@ -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<tmq>\d{4})`
|
||||
FlopRegex = `^\((?P<flop>\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
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user