From 5ae7ff14caed540f44e760350eb8a18cfe6167c0 Mon Sep 17 00:00:00 2001 From: Tnze Date: Tue, 14 Nov 2023 21:10:26 +0800 Subject: [PATCH] Add more tests for snbt parser --- nbt/snbt_decode.go | 26 +++++++++++++------------- nbt/snbt_decode_test.go | 17 ++++++++++++++++- nbt/snbt_scanner_test.go | 4 +++- 3 files changed, 32 insertions(+), 15 deletions(-) diff --git a/nbt/snbt_decode.go b/nbt/snbt_decode.go index 036a716..5695aa6 100644 --- a/nbt/snbt_decode.go +++ b/nbt/snbt_decode.go @@ -21,8 +21,6 @@ func writeValue(e *Encoder, d *decodeState, ifWriteTag bool, tagName string) err switch d.opcode { case scanError: return d.error(d.scan.errContext) - default: - panic(phasePanicMsg) case scanBeginLiteral: start := d.readIndex() @@ -52,30 +50,32 @@ func writeValue(e *Encoder, d *decodeState, ifWriteTag bool, tagName string) err case scanBeginList: _, err := writeListOrArray(e, d, ifWriteTag, tagName) return err + + default: + panic(phasePanicMsg) } } func writeLiteralPayload(e *Encoder, v any) (err error) { - switch v.(type) { + switch v := v.(type) { case string: - str := v.(string) - err = writeInt16(e.w, int16(len(str))) + err = writeInt16(e.w, int16(len(v))) if err != nil { return } - _, err = e.w.Write([]byte(str)) + _, err = e.w.Write([]byte(v)) case int8: - _, err = e.w.Write([]byte{byte(v.(int8))}) + _, err = e.w.Write([]byte{byte(v)}) case int16: - err = writeInt16(e.w, v.(int16)) + err = writeInt16(e.w, v) case int32: - err = writeInt32(e.w, v.(int32)) + err = writeInt32(e.w, v) case int64: - err = writeInt64(e.w, v.(int64)) + err = writeInt64(e.w, v) case float32: - err = writeInt32(e.w, int32(math.Float32bits(v.(float32)))) + err = writeInt32(e.w, int32(math.Float32bits(v))) case float64: - err = writeInt64(e.w, int64(math.Float64bits(v.(float64)))) + err = writeInt64(e.w, int64(math.Float64bits(v))) } return } @@ -508,7 +508,7 @@ func parseLiteral(literal []byte) (byte, any, error) { case 'S', 's': num, err := strconv.ParseInt(string(literal[:strlen]), 10, 16) return TagShort, int16(num), err - default: + case 'I', 'i', 0: num, err := strconv.ParseInt(string(literal[:strlen]), 10, 32) return TagInt, int32(num), err case 'L', 'l': diff --git a/nbt/snbt_decode_test.go b/nbt/snbt_decode_test.go index d9d10cb..cf0684d 100644 --- a/nbt/snbt_decode_test.go +++ b/nbt/snbt_decode_test.go @@ -2,6 +2,7 @@ package nbt import ( "bytes" + "io" "strings" "testing" ) @@ -41,7 +42,7 @@ var testCases = []testCase{ {`[B; ]`, TagByteArray, []byte{7, 0, 0, 0, 0, 0, 0}}, {`[B; 1b ,2B,3B]`, TagByteArray, []byte{7, 0, 0, 0, 0, 0, 3, 1, 2, 3}}, {`[I;]`, TagIntArray, []byte{11, 0, 0, 0, 0, 0, 0}}, - {`[I; 1, 2 ,3]`, TagIntArray, []byte{11, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3}}, + {`[I; -1, 0, 1, 2 ,3]`, TagIntArray, []byte{11, 0, 0, 0, 0, 0, 5, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3}}, {`[L;]`, TagLongArray, []byte{12, 0, 0, 0, 0, 0, 0}}, {`[ L; 1L,2L,3L]`, TagLongArray, []byte{12, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3}}, {`{a:[B;]}`, TagCompound, []byte{10, 0, 0, 7, 0, 1, 'a', 0, 0, 0, 0, 0}}, @@ -82,6 +83,20 @@ func TestEncoder_writeSNBT(t *testing.T) { } } +func TestEncoder_ErrorInput(t *testing.T) { + for _, s := range []string{ + "][", + "[I; 1, b, 3]", + "[I; 1, -2a, 3]", + "[I; 1, -2/I, 3]", + } { + err := NewEncoder(io.Discard).Encode(StringifiedMessage(s), "") + if err == nil { + t.Errorf("String %q is not valid SNBT, expeted to got a error", s) + } + } +} + func TestEncoder_WriteSNBT_bigTest(t *testing.T) { var buf bytes.Buffer e := NewEncoder(&buf) diff --git a/nbt/snbt_scanner_test.go b/nbt/snbt_scanner_test.go index 4f75ba3..dec7cf3 100644 --- a/nbt/snbt_scanner_test.go +++ b/nbt/snbt_scanner_test.go @@ -74,7 +74,9 @@ func TestSNBT_list(t *testing.T) { `[B,C,D]`, `[L, "abc"]`, // List of string (like array) `[B; 01B, 02B, 3B, 10B, 127B]`, // Array `[I;]`, `[B; ]`, // Empty array - `{a:[],b:[B;]}`, // List or Array in TagCompound + `[I; 1, 2, 3, -1, -2, -3]`, // Int array with negtive numbers + `[L; 123L, -123L]`, // Long array with negtive numbers + `{a:[],b:[B;]}`, // List or Array in TagCompound } var s scanner scan := func(str string) bool {