Files
qfixdpl/quickfix/field_map_test.go
2026-03-09 15:35:32 -03:00

205 lines
4.6 KiB
Go

// Copyright (c) quickfixengine.org All rights reserved.
//
// This file may be distributed under the terms of the quickfixengine.org
// license as defined by quickfixengine.org and appearing in the file
// LICENSE included in the packaging of this file.
//
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING
// THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A
// PARTICULAR PURPOSE.
//
// See http://www.quickfixengine.org/LICENSE for licensing information.
//
// Contact ask@quickfixengine.org if any conditions of this licensing
// are not clear to you.
package quickfix
import (
"bytes"
"testing"
"github.com/stretchr/testify/assert"
)
func TestFieldMap_Clear(t *testing.T) {
var fMap FieldMap
fMap.init()
fMap.SetField(1, FIXString("hello"))
fMap.SetField(2, FIXString("world"))
fMap.Clear()
if fMap.Has(1) || fMap.Has(2) {
t.Error("All fields should be cleared")
}
}
func TestFieldMap_SetAndGet(t *testing.T) {
var fMap FieldMap
fMap.init()
fMap.SetField(1, FIXString("hello"))
fMap.SetField(2, FIXString("world"))
var testCases = []struct {
tag Tag
expectErr bool
expectValue string
}{
{tag: 1, expectValue: "hello"},
{tag: 2, expectValue: "world"},
{tag: 44, expectErr: true},
}
for _, tc := range testCases {
var testField FIXString
err := fMap.GetField(tc.tag, &testField)
if tc.expectErr {
assert.NotNil(t, err, "Expected Error")
continue
}
assert.Nil(t, err, "Unexpected error")
assert.Equal(t, tc.expectValue, string(testField))
}
}
func TestFieldMap_Length(t *testing.T) {
var fMap FieldMap
fMap.init()
fMap.SetField(1, FIXString("hello"))
fMap.SetField(2, FIXString("world"))
fMap.SetField(8, FIXString("FIX.4.4"))
fMap.SetField(9, FIXInt(100))
fMap.SetField(10, FIXString("100"))
assert.Equal(t, 16, fMap.length(), "Length should include all fields but beginString, bodyLength, and checkSum")
}
func TestFieldMap_Total(t *testing.T) {
var fMap FieldMap
fMap.init()
fMap.SetField(1, FIXString("hello"))
fMap.SetField(2, FIXString("world"))
fMap.SetField(8, FIXString("FIX.4.4"))
fMap.SetField(Tag(9), FIXInt(100))
fMap.SetField(10, FIXString("100"))
assert.Equal(t, 2116, fMap.total(), "Total should includes all fields but checkSum")
}
func TestFieldMap_TypedSetAndGet(t *testing.T) {
var fMap FieldMap
fMap.init()
fMap.SetString(1, "hello")
fMap.SetInt(2, 256)
s, err := fMap.GetString(1)
assert.Nil(t, err)
assert.Equal(t, "hello", s)
i, err := fMap.GetInt(2)
assert.Nil(t, err)
assert.Equal(t, 256, i)
_, err = fMap.GetInt(1)
assert.NotNil(t, err, "Type mismatch should occur error")
s, err = fMap.GetString(2)
assert.Nil(t, err)
assert.Equal(t, "256", s)
b, err := fMap.GetBytes(1)
assert.Nil(t, err)
assert.True(t, bytes.Equal([]byte("hello"), b))
}
func TestFieldMap_BoolTypedSetAndGet(t *testing.T) {
var fMap FieldMap
fMap.init()
fMap.SetBool(1, true)
v, err := fMap.GetBool(1)
assert.Nil(t, err)
assert.True(t, v)
s, err := fMap.GetString(1)
assert.Nil(t, err)
assert.Equal(t, "Y", s)
fMap.SetBool(2, false)
v, err = fMap.GetBool(2)
assert.Nil(t, err)
assert.False(t, v)
s, err = fMap.GetString(2)
assert.Nil(t, err)
assert.Equal(t, "N", s)
}
func TestFieldMap_CopyInto(t *testing.T) {
var fMapA FieldMap
fMapA.initWithOrdering(headerFieldOrdering)
fMapA.SetString(9, "length")
fMapA.SetString(8, "begin")
fMapA.SetString(35, "msgtype")
fMapA.SetString(1, "a")
assert.Equal(t, []Tag{8, 9, 35, 1}, fMapA.sortedTags())
var fMapB FieldMap
fMapB.init()
fMapB.SetString(1, "A")
fMapB.SetString(3, "C")
fMapB.SetString(4, "D")
assert.Equal(t, fMapB.sortedTags(), []Tag{1, 3, 4})
fMapA.CopyInto(&fMapB)
assert.Equal(t, []Tag{8, 9, 35, 1}, fMapB.sortedTags())
// new fields
s, err := fMapB.GetString(35)
assert.Nil(t, err)
assert.Equal(t, "msgtype", s)
// existing fields overwritten
s, err = fMapB.GetString(1)
assert.Nil(t, err)
assert.Equal(t, "a", s)
// old fields cleared
_, err = fMapB.GetString(3)
assert.NotNil(t, err)
// check that ordering is overwritten
fMapB.SetString(2, "B")
assert.Equal(t, []Tag{8, 9, 35, 1, 2}, fMapB.sortedTags())
// updating the existing map doesn't affect the new
fMapA.init()
fMapA.SetString(1, "AA")
s, err = fMapB.GetString(1)
assert.Nil(t, err)
assert.Equal(t, "a", s)
fMapA.Clear()
s, err = fMapB.GetString(1)
assert.Nil(t, err)
assert.Equal(t, "a", s)
}
func TestFieldMap_Remove(t *testing.T) {
var fMap FieldMap
fMap.init()
fMap.SetField(1, FIXString("hello"))
fMap.SetField(2, FIXString("world"))
fMap.Remove(1)
assert.False(t, fMap.Has(1))
assert.True(t, fMap.Has(2))
}