192 lines
3.6 KiB
Go
192 lines
3.6 KiB
Go
package datadictionary
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestParseBadPath(t *testing.T) {
|
|
if _, err := Parse("../spec/bogus.xml"); err == nil {
|
|
t.Error("Expected err")
|
|
}
|
|
}
|
|
|
|
func TestParseRecursiveComponents(t *testing.T) {
|
|
dict, err := Parse("../spec/FIX44.xml")
|
|
|
|
if dict == nil {
|
|
t.Error("Dictionary is nil")
|
|
}
|
|
|
|
if err != nil {
|
|
t.Errorf("Unexpected err: %v", err)
|
|
}
|
|
}
|
|
|
|
var cachedDataDictionary *DataDictionary
|
|
|
|
func dict() (*DataDictionary, error) {
|
|
if cachedDataDictionary != nil {
|
|
return cachedDataDictionary, nil
|
|
}
|
|
|
|
var err error
|
|
cachedDataDictionary, err = Parse("../spec/FIX43.xml")
|
|
return cachedDataDictionary, err
|
|
}
|
|
|
|
func TestComponents(t *testing.T) {
|
|
d, _ := dict()
|
|
if _, ok := d.ComponentTypes["SpreadOrBenchmarkCurveData"]; ok != true {
|
|
t.Error("Component not found")
|
|
}
|
|
}
|
|
|
|
func TestFieldsByTag(t *testing.T) {
|
|
d, _ := dict()
|
|
|
|
var tests = []struct {
|
|
Tag int
|
|
Name string
|
|
Type string
|
|
EnumsAreNil bool
|
|
}{
|
|
{655, "ContraLegRefID", "STRING", true},
|
|
{658, "QuoteRequestRejectReason", "INT", false},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
f, ok := d.FieldTypeByTag[test.Tag]
|
|
|
|
if !ok {
|
|
t.Errorf("%v not found", test.Tag)
|
|
}
|
|
|
|
if f.Name() != test.Name {
|
|
t.Errorf("Expected %v got %v", test.Name, f.Name())
|
|
}
|
|
|
|
if f.Type != test.Type {
|
|
t.Errorf("Expected %v got %v", test.Type, f.Type)
|
|
}
|
|
|
|
switch {
|
|
|
|
case f.Enums != nil && test.EnumsAreNil:
|
|
t.Errorf("Expected no enums")
|
|
case f.Enums == nil && !test.EnumsAreNil:
|
|
t.Errorf("Expected enums")
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestEnumFieldsByTag(t *testing.T) {
|
|
|
|
d, _ := dict()
|
|
f := d.FieldTypeByTag[658]
|
|
|
|
var tests = []struct {
|
|
Value string
|
|
Description string
|
|
}{
|
|
{"1", "UNKNOWN_SYMBOL"},
|
|
{"2", "EXCHANGE"},
|
|
{"3", "QUOTE_REQUEST_EXCEEDS_LIMIT"},
|
|
{"4", "TOO_LATE_TO_ENTER"},
|
|
{"5", "INVALID_PRICE"},
|
|
{"6", "NOT_AUTHORIZED_TO_REQUEST_QUOTE"},
|
|
}
|
|
|
|
if len(f.Enums) != len(tests) {
|
|
t.Errorf("Expected %v enums got %v", len(tests), len(f.Enums))
|
|
}
|
|
|
|
for _, test := range tests {
|
|
if enum, ok := f.Enums[test.Value]; !ok {
|
|
t.Errorf("Expected Enum %v", test.Value)
|
|
} else {
|
|
|
|
if enum.Value != test.Value {
|
|
t.Errorf("Expected value %v got %v", test.Value, enum.Value)
|
|
}
|
|
|
|
if enum.Description != test.Description {
|
|
t.Errorf("Expected description %v got %v", test.Description, enum.Description)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestDataDictionaryMessages(t *testing.T) {
|
|
d, _ := dict()
|
|
_, ok := d.Messages["D"]
|
|
if !ok {
|
|
t.Error("Did not find message")
|
|
}
|
|
}
|
|
|
|
func TestDataDictionaryHeader(t *testing.T) {
|
|
d, _ := dict()
|
|
if d.Header == nil {
|
|
t.Error("Did not find header")
|
|
}
|
|
}
|
|
|
|
func TestDataDictionaryTrailer(t *testing.T) {
|
|
d, _ := dict()
|
|
if d.Trailer == nil {
|
|
t.Error("Did not find trailer")
|
|
}
|
|
}
|
|
|
|
func TestMessageRequiredTags(t *testing.T) {
|
|
d, _ := dict()
|
|
|
|
nos := d.Messages["D"]
|
|
|
|
var tests = []struct {
|
|
*MessageDef
|
|
Tag int
|
|
Required bool
|
|
}{
|
|
{nos, 11, true},
|
|
{nos, 526, false},
|
|
{d.Header, 8, true},
|
|
{d.Header, 115, false},
|
|
{d.Trailer, 10, true},
|
|
{d.Trailer, 89, false},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
switch _, required := test.MessageDef.RequiredTags[test.Tag]; {
|
|
case required && !test.Required:
|
|
t.Errorf("%v should not be required", test.Tag)
|
|
case !required && test.Required:
|
|
t.Errorf("%v should not required", test.Tag)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestMessageTags(t *testing.T) {
|
|
d, _ := dict()
|
|
|
|
nos := d.Messages["D"]
|
|
|
|
var tests = []struct {
|
|
*MessageDef
|
|
Tag int
|
|
}{
|
|
{nos, 11},
|
|
{nos, 526},
|
|
{d.Header, 8},
|
|
{d.Header, 115},
|
|
{d.Trailer, 10},
|
|
{d.Trailer, 89},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
if _, known := test.MessageDef.Tags[test.Tag]; !known {
|
|
t.Errorf("%v is not known", test.Tag)
|
|
}
|
|
}
|
|
}
|