Files
qfixpt/quickfix/datadictionary/datadictionary_test.go
2026-03-12 12:08:34 -03:00

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)
}
}
}