Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ gocode/flyweight/src/*/*.go
!gocode/flyweight/src/*/*_test.go
gocode/flyweight/src/*/*/*.go
!gocode/flyweight/src/*/*/*_test.go
gocode/flyweight/src/otf/code-generation-schema.sbeir
gocode/flyweight/src/otf/*.sbeir

# csharp
csharp/*/bin
Expand Down
47 changes: 47 additions & 0 deletions gocode/flyweight/src/otf/flyweight_single_char_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package otf

import (
stdjson "encoding/json"
"github.com/real-logic/simple-binary-encoding/otf/test/flyweight_single_char"
"github.com/stretchr/testify/assert"
"testing"
)

//go:generate java --add-opens java.base/jdk.internal.misc=ALL-UNNAMED -Dsbe.output.dir=. -Dsbe.target.language=golang -Dsbe.go.generate.generate.flyweights=true -Dsbe.generate.ir=true -Dsbe.keyword.append.token=X -jar ../../../${SBE_JAR} ../../../../sbe-tool/src/test/resources/flyweight-single-char-schema.xml

func TestSingleCharFieldsRenderAsValidJson(t *testing.T) {
cases := []struct {
name string
value byte
expected string
}{
{"letter", 'A', "A"},
{"quote", '"', "\""},
{"backslash", '\\', "\\"},
{"newline", '\n', "\n"},
{"control", 0x01, "\x01"},
{"high", 0xe9, "é"},
}

for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
buffer := make([]byte, 64)
var letter flyweight_single_char.Letter
letter.WrapAndApplyHeader(buffer, 0, uint64(len(buffer))).SetCode(c.value)
letter.EntriesCount(1).Next().SetSide(c.value)

var decoder flyweight_single_char.Letter
decoder.WrapForDecode(buffer, 8, uint64(letter.SbeBlockLength()), 0, uint64(len(buffer)))

var decoded struct {
Code string
Entries []struct{ Side string }
}
if err := stdjson.Unmarshal([]byte(decoder.String()), &decoded); err != nil {
t.Fatalf("invalid JSON: %v\n%s", err, decoder.String())
}
assert.Equal(t, c.expected, decoded.Code)
assert.Equal(t, c.expected, decoded.Entries[0].Side)
})
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2947,8 +2947,17 @@ private void writeTokenDisplay(

if (typeToken.encoding().primitiveType() == PrimitiveType.CHAR)
{
sb.append(indent).append("builder.WriteString(fmt.Sprintf(`\"%c\"`, ").append(fieldName)
.append("()))\n");
sb.append(
indent + "builder.WriteString(`\"`)\n" +
indent + "switch c := " + fieldName + "(); {\n" +
indent + "case c == '\"' || c == '\\\\':\n" +
indent + "\tbuilder.WriteString(\"\\\\\" + string(rune(c)))\n" +
indent + "case c < 0x20:\n" +
indent + "\tbuilder.WriteString(fmt.Sprintf(\"\\\\u%04x\", c))\n" +
indent + "default:\n" +
indent + "\tbuilder.WriteString(string(rune(c)))\n" +
indent + "}\n" +
indent + "builder.WriteString(`\"`)\n");
}
else
{
Expand Down
27 changes: 27 additions & 0 deletions sbe-tool/src/test/resources/flyweight-single-char-schema.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sbe:messageSchema xmlns:sbe="http://fixprotocol.io/2016/sbe"
package="flyweight_single_char"
id="9"
version="0"
semanticVersion="0"
description="Single char fields rendered by the generated String methods"
byteOrder="littleEndian">
<types>
<composite name="messageHeader" description="Message identifiers and length of message root">
<type name="blockLength" primitiveType="uint16"/>
<type name="templateId" primitiveType="uint16"/>
<type name="schemaId" primitiveType="uint16"/>
<type name="version" primitiveType="uint16"/>
</composite>
<composite name="groupSizeEncoding" description="Repeating group dimensions">
<type name="blockLength" primitiveType="uint16"/>
<type name="numInGroup" primitiveType="uint16"/>
</composite>
</types>
<sbe:message name="Letter" id="1">
<field name="code" id="1" type="char"/>
<group name="entries" id="2" dimensionType="groupSizeEncoding">
<field name="side" id="3" type="char"/>
</group>
</sbe:message>
</sbe:messageSchema>