| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // This is the input file for VOM test data, in the VDL config file format. The |
| // purpose of this file is to make it easy to add VOM test cases for each |
| // generated language. |
| // |
| // In order to add new test cases, simply add new values to the list below. |
| // Test types are defined in the types/vomtype.vdl file in this directory; they |
| // can't appear in this file since they're not allowed in VDL config files. |
| // |
| // To re-generate the tests: |
| // 0) If your PATH does not include $JIRI_ROOT/release/go/bin, then prefix |
| // commands 2 and 3 with PATH=$JIRI_ROOT/release/go/bin:$PATH |
| // This way, the new binaries are run without overwriting existing dev tools. |
| // 1) jiri go install v.io/x/ref/cmd/{vdl,vomtestgen} |
| // 2) jiri run vomtestgen |
| // 3) jiri run vdl generate v.io/v23/vom/... |
| // |
| // Running "vomtestgen" against this file produces the vomdata.vdl file, and |
| // running "vdl generate" against the resulting package produces the VOM test |
| // data in each generated language. |
| config = x |
| |
| import ( |
| t "v.io/v23/vom/testdata/types" |
| ) |
| |
| const bytes8 = []byte{0, 0, 0, 0, 0, 0, 0, 0} |
| const bytes256 = []byte(string(bytes8)+string(bytes8)+string(bytes8)+string(bytes8)+string(bytes8)+string(bytes8)+string(bytes8)+string(bytes8)) |
| const bytes2048 = []byte(string(bytes256)+string(bytes256)+string(bytes256)+string(bytes256)+string(bytes256)+string(bytes256)+string(bytes256)+string(bytes256)) |
| const bytes64k = []byte(string(bytes2048)+string(bytes2048)+string(bytes2048)+string(bytes2048)+string(bytes2048)+string(bytes2048)+string(bytes2048)+string(bytes2048)) |
| const bytes128k = []byte(string(bytes64k)+string(bytes64k)) |
| |
| // encodeDecodeData is a slice of values, where each value is used to generate a |
| // TestCase in the Tests slice in vomdata.vdl. That file is then generated into |
| // language-specific files to serve as test cases for the vom implementations in |
| // each language. |
| // |
| // Each TestCase includes the value itself, along with the "golden" hex |
| // representation of the vom encoding of the value, generated from the Go |
| // implementation. Tests in each language take each TestCase and check that |
| // encoding the value creates byte-wise identical hex bytes as the golden bytes, |
| // and decoding from the golden bytes produces an identical value. This is a |
| // very strict form of a round-trip encoding/decoding test; not only are we |
| // ensuring that round-trip encoding/decoding works, we also ensure that the |
| // generated encoding is byte-wise identical in each language. |
| // |
| // The vomdata.vdl file also includes comments describing each component of the |
| // hex encoding, generated via vom.Dump. The comments should be checked |
| // manually to ensure that the generated hex bytes are indeed correct, as per |
| // the vom specification. |
| const encodeDecodeData = []any{ |
| // Values of simple unnamed types. |
| bool(true), bool(false), |
| string(""), string("abc"), |
| []byte(""), []byte{255, 0, 1}, []byte("adef"), |
| |
| byte(0), byte(127), byte(255), |
| |
| uint16(0), uint16(1), uint16(2), uint16(63), uint16(64), |
| uint16(127), uint16(128), uint16(255), uint16(256), |
| uint16(0x7ffe), uint16(0x7fff), uint16(0xfffe), uint16(0xffff), |
| |
| uint32(0), |
| uint32(0x7ffffe), uint32(0x7fffff), |
| uint32(0xfffffe), uint32(0xffffff), |
| uint32(0x7ffffffe), uint32(0x7fffffff), |
| uint32(0xfffffffe), uint32(0xffffffff), |
| |
| uint64(0), |
| uint64(0x7ffffffffe), uint64(0x7fffffffff), |
| uint64(0xfffffffffe), uint64(0xffffffffff), |
| uint64(0x7ffffffffffe), uint64(0x7fffffffffff), |
| uint64(0xfffffffffffe), uint64(0xffffffffffff), |
| uint64(0x7ffffffffffffe), uint64(0x7fffffffffffff), |
| uint64(0xfffffffffffffe), uint64(0xffffffffffffff), |
| uint64(0x7ffffffffffffffe), uint64(0x7fffffffffffffff), |
| uint64(0xfffffffffffffffe), uint64(0xffffffffffffffff), |
| |
| int16(0), int16(1), int16(2), int16(63), int16(64), |
| int16(127), int16(128), int16(255), int16(256), |
| int16(0x7ffe), int16(0x7fff), |
| |
| int32(0), |
| int32(0x7ffffe), int32(0x7fffff), |
| int32(0xfffffe), int32(0xffffff), |
| int32(0x7ffffffe), int32(0x7fffffff), |
| |
| int64(0), |
| int64(1), int64(2), |
| int64(0x7ffffffffe), int64(0x7fffffffff), |
| int64(0xfffffffffe), int64(0xffffffffff), |
| int64(0x7ffffffffffe), int64(0x7fffffffffff), |
| int64(0xfffffffffffe), int64(0xffffffffffff), |
| int64(0x7ffffffffffffe), int64(0x7fffffffffffff), |
| int64(0xfffffffffffffe), int64(0xffffffffffffff), |
| int64(0x7ffffffffffffffe), int64(0x7fffffffffffffff), |
| |
| int16(-1), int16(-2), int16(-64), int16(-65), |
| int16(-128), int16(-129), int16(-256), int16(-257), |
| int16(-0x7fff), int16(-0x8000), |
| |
| int32(-0x7fffff), int32(-0x800000), |
| int32(-0xffffff), int32(-0x1000000), |
| int32(-0x7fffffff), int32(-0x80000000), |
| |
| int64(-1), int64(-2), |
| int64(-0x7fffffffff), int64(-0x8000000000), |
| int64(-0xffffffffff), int64(-0x10000000000), |
| int64(-0x7fffffffffff), int64(-0x800000000000), |
| int64(-0xffffffffffff), int64(-0x1000000000000), |
| int64(-0x7fffffffffffff), int64(-0x80000000000000), |
| int64(-0xffffffffffffff), int64(-0x100000000000000), |
| int64(-0x7fffffffffffffff), int64(-0x8000000000000000), |
| |
| float32(0), float32(32.5), float32(-32.5), |
| float64(0), float64(64.5), float64(-64.5), |
| |
| // Values of simple named types. |
| t.NBool(true), t.NBool(false), |
| t.NString(""), t.NString("abc"), |
| t.NByteSlice{}, t.NByteSlice{255, 0, 1}, t.NByteSlice("abc"), |
| t.NByteArray{}, t.NByteArray{255, 0, 1}, t.NByteArray("abcd"), |
| t.NByte(0), t.NByte(127), t.NByte(255), |
| t.NUint16(0), t.NUint16(0xffff), |
| t.NUint32(0), t.NUint32(0xffffffff), |
| t.NUint64(0), t.NUint64(0xffffffffffffffff), |
| t.NInt16(0), t.NInt16(0x7fff), t.NInt16(-0x8000), |
| t.NInt32(0), t.NInt32(0x7fffffff), t.NInt32(-0x80000000), |
| t.NInt64(0), t.NInt64(0x7fffffffffffffff), t.NInt64(-0x8000000000000000), |
| t.NFloat32(0), t.NFloat32(32.5), t.NFloat32(-32.5), |
| t.NFloat64(0), t.NFloat64(64.5), t.NFloat64(-64.5), |
| |
| // Values of composite types. |
| // |
| // TODO(toddw): Add more than 1 entry to the set and map values, after |
| // accounting for possible ordering differences. |
| t.NArray2Uint64{1, 2}, |
| []uint64{1, 2}, t.NListUint64{1, 2}, |
| set[uint64]{1}, t.NSetUint64{1}, |
| map[uint64]string{1:"abc"}, t.NMapUint64String{1:"abc"}, |
| t.NStruct{A: true, B: "abc", C: 123 }, |
| ?t.NStruct(nil), // ?t.NStruct{}, ?t.NStruct{A: true, B: "abc", C: 123}, // TODO(bprosnitz) Figure out how to support top-level nil tests |
| |
| // Values of special types. |
| // TODO(toddw): Add tests for embedded Any, etc. |
| t.NEnum.A, t.NEnum.B, t.NEnum.C, |
| t.NUnion{A: true}, t.NUnion{A: false}, |
| t.NUnion{B: ""}, t.NUnion{B: "abc"}, |
| t.NUnion{C: 0}, t.NUnion{C: 123}, t.NUnion{C: -123}, |
| |
| // Values of nested custom types. |
| t.MBool(true), t.MBool(false), |
| t.MStruct{A: true, B: t.NBool(true), C: t.MBool(true)}, |
| t.MStruct{D: nil}, t.MStruct{D: {}}, t.MStruct{D: {true, "abc", 123}}, |
| t.MStruct{F: "abc"}, t.MStruct{F: t.MBool(true)}, t.MStruct{F: ?t.NStruct{B: "abc"}}, |
| t.MList{t.NListUint64{4, 2}, t.NListUint64{}, t.NListUint64{99}}, |
| // TODO(bprosnitz) Add more than one entry to the map, after we have |
| // support for testing reordered bytes. |
| t.MMap{t.NFloat32(4.5): t.NListUint64{2,3}}, |
| |
| // Values of recursive types. |
| t.RecA{t.RecA{},t.RecA{t.RecA{}}}, |
| t.RecX{t.RecY{},t.RecY{t.RecX{}, t.RecX{}}}, |
| t.Rec1{t.Rec2{t.Rec3{t.Rec4{t.Rec1{}}}}}, |
| t.RecStruct{?t.RecStruct{}}, t.RecStruct{?t.RecStruct{?t.RecStruct{}}}, |
| t.Rec1234All{t.Rec1234A{[]t.Rec1234A{t.Rec1234A{}},[]t.Rec1234{t.Rec1234{R1:t.Rec1{}}}},t.Rec1234B{[]t.Rec1234B{t.Rec1234B{}},[]t.Rec1234{t.Rec1234{R2:t.Rec2{t.Rec3{}}}}}}, |
| |
| // Values of typeobject types. |
| typeobject(any), |
| typeobject(bool), |
| typeobject(uint16),typeobject(uint32),typeobject(uint64), |
| typeobject(int16),typeobject(int32),typeobject(int64), |
| typeobject(int16),typeobject(int32),typeobject(int64), |
| typeobject(float32),typeobject(float64), |
| typeobject(t.NBool), |
| typeobject(t.NUint16),typeobject(t.NUint32),typeobject(t.NUint64), |
| typeobject(t.NInt16),typeobject(t.NInt32),typeobject(t.NInt64), |
| typeobject(t.NFloat32),typeobject(t.NFloat64), |
| typeobject(t.NArray2Uint64), |
| typeobject([]uint64), typeobject(t.NListUint64), |
| typeobject(set[uint64]), typeobject(t.NSetUint64), |
| typeobject(map[uint64]string), typeobject(t.NMapUint64String), |
| typeobject(t.NStruct), |
| typeobject(t.NEnum), typeobject(t.NUnion), |
| []typeobject{typeobject(any), typeobject(bool)}, |
| |
| // Regression tests to ensure "any" typed struct fields with zero values are |
| // encoded and decoded correctly. https://v.io/c/12030 |
| t.StructAny{nil}, t.StructAny{false}, |
| t.StructAny{int16(0)}, t.StructAny{int32(0)}, t.StructAny{int64(0)}, |
| t.StructAny{uint16(0)}, t.StructAny{uint32(0)}, t.StructAny{uint64(0)}, |
| t.StructAny{float32(0)}, t.StructAny{float64(0)}, |
| t.StructAny{""}, t.StructAny{[]byte{}}, |
| t.StructAny{t.FoodEnum.Bean}, |
| t.StructAny{t.NListUint64{}}, t.StructAny{t.NByteArray{}}, t.StructAny{t.NArray2Uint64{}}, |
| t.StructAny{t.NSetUint64{}}, t.StructAny{t.NMapUint64String{}}, |
| t.StructAny{t.NStruct{}}, t.StructAny{t.NUnion{A: false}}, |
| t.StructAny{?t.NStruct(nil)}, t.StructAny{?t.NStruct{}}, |
| t.StructAny{t.StructMap{}}, t.StructAny{t.StructMap{{0: 0}}}, |
| t.StructAny{typeobject(any)}, |
| ?t.StructAny(nil), //?t.StructAny{nil}, ?t.StructAny{false}, // TODO(bprosnitz) Think about how to handle top-level nil |
| //?t.StructAny{t.StructMap{}}, ?t.StructAny{t.StructMap{{0: 0}}}, |
| // Non-zero values inside anys in structs. |
| t.StructAny{true}, t.StructAny{byte(1)}, |
| t.StructAny{int16(1)}, t.StructAny{int32(1)}, t.StructAny{int64(1)}, |
| t.StructAny{uint16(1)}, t.StructAny{uint32(1)}, t.StructAny{uint64(1)}, |
| t.StructAny{float32(1)}, t.StructAny{float64(1)}, |
| t.StructAny{"A"}, t.StructAny{[]byte("A")}, |
| t.StructAny{t.FoodEnum.Cherry}, |
| t.StructAny{t.NListUint64{1}}, t.StructAny{t.NByteArray("Abcd")}, t.StructAny{t.NArray2Uint64{0, 1}}, |
| t.StructAny{t.NSetUint64{1}}, t.StructAny{t.NMapUint64String{1: "A"}}, |
| t.StructAny{t.NStruct{A: true}}, t.StructAny{t.NUnion{A: true}}, |
| t.StructAny{typeobject(bool)}, |
| |
| // Top-level anys (may be handled differently than anys in structs) |
| any(nil), |
| // Zero-values: |
| any(false), any(byte(0)), |
| any(int16(0)), any(int32(0)), any(int64(0)), |
| any(uint16(0)), any(uint32(0)), any(uint64(0)), |
| any(float32(0)), any(float64(0)), |
| any(""), any([]byte{}), |
| any(t.FoodEnum.Bean), |
| any(t.NListUint64{}), any(t.NByteArray{}), any(t.NArray2Uint64{}), |
| any(t.NSetUint64{}), any(t.NMapUint64String{}), |
| any(t.NStruct{}), any(t.NUnion{A: false}), |
| any(typeobject(any)), |
| // Non-zero values. |
| any(true), any(byte(1)), |
| any(int16(1)), any(int32(1)), any(int64(1)), |
| any(uint16(1)), any(uint32(1)), any(uint64(1)), |
| any(float32(1)), any(float64(1)), |
| any("A"), any([]byte("A")), |
| any(t.FoodEnum.Cherry), |
| any(t.NListUint64{1}), any(t.NByteArray("Abcd")), any(t.NArray2Uint64{0, 1}), |
| any(t.NSetUint64{1}), any(t.NMapUint64String{1: "A"}), |
| any(t.NStruct{A: true}), any(t.NUnion{A: true}), |
| any(typeobject(bool)), |
| |
| t.StructManyTypes{}, // Test zero values in structs |
| t.StructManyTypes{ |
| Bool: true, |
| AByte: 1, |
| Int16: 1, |
| Int32: 1, |
| Int64: 1, |
| Uint16: 1, |
| Uint32: 1, |
| Uint64: 1, |
| String: "A", |
| Bytes: []byte("A"), |
| Float32: 1, |
| Float64: 1, |
| FoodEnum: Cherry, |
| NListUint64: t.NListUint64{1}, |
| NByteArray: t.NByteArray("Abcd"), |
| NArray2Uint64: t.NArray2Uint64{0, 1}, |
| NSetUint64: t.NSetUint64{1}, |
| NMapUint64String: t.NMapUint64String{1: "A"}, |
| NStruct: t.NStruct{ |
| A: true, |
| }, |
| NUnion: t.NUnion{ |
| A: true, |
| }, |
| TypeObject: typeobject(bool), |
| }, |
| |
| // Ensure that message with multiple type ids (including repeats) are represented |
| // properly. |
| t.AnySlice{ |
| t.NInt16(1), |
| t.NInt32(2), |
| t.NInt64(3), |
| t.NInt32(4), |
| }, |
| []t.StructAny{ |
| t.StructAny{t.NInt16(1)}, |
| t.StructAny{t.NInt32(2)}, |
| t.StructAny{t.NInt64(3)}, |
| t.StructAny{t.NInt32(4)}, |
| }, |
| } |
| |
| const encodeDecodeDataMin81 = []any{ |
| int8(0), int8(-128), int8(127), |
| t.NInt8(0), t.NInt8(-128), t.NInt8(127), |
| any(int8(0)), any(int8(1)), typeobject(int8), |
| t.MInt8Slice{-128, -1, 0, 127}, |
| t.StructAny{int8(1)}, |
| } |
| |
| // compatData is used to generate CompatTests in vomdata.vdl, and is used to |
| // test vom type compatibility. The mapping is from test name to a slice of |
| // types that must be mutually compatible with each other. Types with different |
| // test names must be incompatible with each other. |
| const compatData = map[string][]typeobject{ |
| "bool": { |
| typeobject(bool), typeobject(t.NBool), typeobject(t.MBool), |
| }, |
| "number": { |
| typeobject(uint16),typeobject(uint32),typeobject(uint64), |
| typeobject(int16),typeobject(int32),typeobject(int64), |
| typeobject(float32),typeobject(float64), |
| typeobject(t.NUint16),typeobject(t.NUint32),typeobject(t.NUint64), |
| typeobject(t.NInt16),typeobject(t.NInt32),typeobject(t.NInt64), |
| typeobject(t.NFloat32),typeobject(t.NFloat64), |
| }, |
| "string/[]byte/enum": { |
| typeobject(string),typeobject(t.NString), |
| typeobject([]byte),typeobject(t.NByteSlice),typeobject(t.NByteArray), |
| typeobject(t.NEnum), |
| }, |
| "number list/array": { // number lists |
| typeobject([]int32),typeobject(t.NArray2Uint64),typeobject(t.NListUint64), |
| }, |
| "string list/array": { // string lists |
| typeobject([]string),typeobject(t.ListString),typeobject(t.Array3String),typeobject(t.Array4String), |
| }, |
| "struct A": { // structs with themselves (1 common field) |
| typeobject(t.NStruct),typeobject(t.AbcStruct),typeobject(t.AdeStruct), |
| }, |
| "struct Z": { // structs with themselves (a different common field) |
| typeobject(t.XyzStruct),typeobject(t.YzStruct),typeobject(t.ZStruct), |
| }, |
| "map[string]X/struct": { // maps and structs (all fields have compatible types) |
| typeobject(t.MapOnlyStruct),typeobject(t.StructOnlyMap), |
| }, |
| "map[string]bool/set[string]/struct": { // maps, sets, and structs (elem/field are bool) |
| typeobject(t.MapSetStruct),typeobject(t.SetStructMap),typeobject(t.MapStructSet), |
| }, |
| "map[X]bool/set[X]": { // maps and sets (non-string keys) |
| typeobject(t.SetOnlyMap),typeobject(t.MapOnlySet), typeobject(t.SometimesSetMap), |
| }, |
| "union B": { |
| typeobject(t.NUnion),typeobject(t.BdeUnion), |
| }, |
| "typeobject": { |
| typeobject(typeobject), |
| }, |
| } |
| |
| // convertData is used to generate ConvertTests in vomdata.vdl, and is used to |
| // test vom value convertibility. The mapping is from test name to a slice of |
| // ordered ConvertGroups. All values within the same ConvertGroup must be |
| // convertible to each other. Values in ConvertGroups with a larger index will |
| // return an error when conversion is attempted to the primary type of |
| // ConvertGroups with a lower index. |
| const convertData = map[string][]t.ConvertGroup{ |
| "bool": { |
| { |
| "bool", |
| typeobject(bool), |
| { |
| true, |
| t.NBool(true), |
| t.MBool(true), |
| }, |
| }, |
| }, |
| "number": { |
| { |
| "byte", |
| typeobject(byte), |
| { |
| byte(3),uint16(3),int32(3),float64(3),int64(3), |
| }, |
| }, |
| { |
| "uint16", |
| typeobject(uint16), |
| { |
| uint16(256),int32(256),float64(256),int64(256), |
| }, |
| }, |
| { |
| "int32", |
| typeobject(int32), |
| { |
| int32(-5),float64(-5),int64(-5), |
| // int8(-5), // TODO(bprosnitz) In order to add int8, we need VOM support in java because it uses VOM for conversion. |
| }, |
| }, |
| { |
| "float64", |
| typeobject(float64), |
| { |
| float64(3.3), |
| }, |
| }, |
| { |
| "int64", |
| typeobject(int64), |
| { |
| int64(-0x8000000000000000), |
| }, |
| }, |
| }, |
| "string and enum": { |
| { |
| "enum (A)", |
| typeobject(t.NEnum), |
| { |
| "A", |
| t.NString("A"), |
| t.NEnum.A, |
| }, |
| }, |
| { |
| "enum (brie)", |
| typeobject(t.BrieEnum), |
| { |
| "Brie", |
| t.NString("Brie"), |
| t.BrieEnum.Brie, |
| t.FoodEnum.Brie, |
| }, |
| }, |
| { |
| "string", |
| typeobject(t.NString), |
| { |
| "Cherry", |
| t.NString("Cherry"), |
| t.FoodEnum.Cherry, |
| }, |
| }, |
| }, |
| "struct, map, and set": { |
| { |
| "map[uint32]uint32", |
| typeobject(t.MapOnlyA), |
| { |
| t.MapOnlyA{ |
| 4: 0, |
| 6: 7, |
| }, |
| t.MapOnlyA2{ |
| 4: 0, |
| 6: 7.0, |
| }, |
| }, |
| }, |
| { |
| "map[bool]string", |
| typeobject(t.MapOnlyB), |
| { |
| t.MapOnlyB{ |
| true: "hello", |
| }, |
| t.MapOnlyB2{ |
| true: "hello", |
| }, |
| }, |
| }, |
| { |
| "set[bool]", |
| typeobject(t.SetOnlyA), |
| { |
| t.SetOnlyA{ |
| true, |
| false, |
| }, |
| t.SetOnlyA2{ |
| true, |
| false, |
| }, |
| }, |
| }, |
| { |
| "set[int16]", |
| typeobject(t.SetOnlyB), |
| { |
| t.SetOnlyB{ |
| 4, |
| 6, |
| }, |
| t.SetOnlyB2{ |
| 4, |
| 6, |
| }, |
| }, |
| }, |
| { |
| "structABC", |
| typeobject(t.AbcStruct), |
| { |
| t.AbcStruct{ |
| A: true, |
| B: "", |
| C: 0, |
| }, |
| t.AdeStruct{ |
| A: true, |
| D: nil, |
| E: typeobject(any), |
| }, |
| t.NStruct{ |
| A: true, |
| }, |
| }, |
| }, |
| { |
| "structYz", |
| typeobject(t.YzStruct), |
| { |
| t.XyzStruct{ |
| Z: "ahoy", |
| }, |
| t.YzStruct{ |
| Z: "ahoy", |
| }, |
| t.ZStruct{ |
| Z: "ahoy", |
| }, |
| }, |
| }, |
| { |
| "struct+map", |
| typeobject(t.MapOnlyStruct), |
| { |
| t.StructOnlyMap{ |
| "Key1": 4, |
| "Key2": 5, |
| }, |
| t.MapOnlyStruct{ |
| Key1: 4, |
| Key2: 5, |
| }, |
| }, |
| }, |
| { |
| "map+set", |
| typeobject(t.MapOnlySet), |
| { |
| t.MapOnlySet{ |
| 3.14, |
| 8, |
| }, |
| t.SometimesSetMap{ |
| 3.14: true, |
| 8: true, |
| }, |
| t.SetOnlyMap{ |
| 3.14: true, |
| 8: true, |
| }, |
| }, |
| }, |
| { // questionable because it works... |
| "map-set", |
| typeobject(t.SetOnlyMap), |
| { |
| t.SometimesSetMap{ |
| 3.14: "cannot be a set anymore", |
| 8: true, |
| }, |
| }, |
| }, |
| { |
| "struct+map+set", |
| typeobject(t.MapStructSet), |
| { |
| t.MapStructSet{ |
| "Feat", |
| "Tire", |
| "Eel", |
| }, |
| t.SetStructMap{ |
| "Feat": true, |
| "Tire": true, |
| "Eel": true, |
| }, |
| t.MapSetStruct{ |
| Feat: true, |
| Tire: true, |
| Eel: true, |
| }, |
| }, |
| }, |
| }, |
| "array/list": { |
| { |
| "[3]string", |
| typeobject(t.Array3String), |
| { |
| t.Array3String{ |
| "A", |
| "B", |
| "C", |
| }, |
| []string{ |
| "A", |
| "B", |
| "C", |
| }, |
| // I really want to check [3]string to [4]string... |
| }, |
| }, |
| { |
| "[4]string", |
| typeobject(t.Array4String), |
| { |
| t.Array4String{ |
| "D", |
| "E", |
| "F", |
| "G", |
| }, |
| }, |
| }, |
| { |
| "ByteArray", |
| typeobject(t.NByteArray), |
| { |
| t.NByteArray{ |
| 5, |
| 2, |
| 0, |
| 4, |
| }, |
| []byte{ |
| 5, |
| 2, |
| 0, |
| 4, |
| }, |
| // I really want to omit some of these bytes... |
| }, |
| }, |
| }, |
| "typeobject": { |
| { |
| "typeobject(any)", |
| typeobject(typeobject), |
| { |
| typeobject(any), |
| }, |
| }, |
| }, |
| "union": { |
| { |
| "BdeUnion", |
| typeobject(t.BdeUnion), |
| { |
| t.BdeUnion{ |
| B: "bde", |
| }, |
| t.NUnion{ |
| B: "bde", |
| }, |
| }, |
| }, |
| { |
| "BdeUnion fail", |
| typeobject(t.NUnion), |
| { |
| t.NUnion{ |
| A: true, |
| }, |
| }, |
| }, |
| }, |
| } |
| |
| const x = t.VomdataStruct{ |
| EncodeDecodeData: map[byte][]any{ |
| 0x80: encodeDecodeData, |
| 0x81: encodeDecodeDataMin81, |
| }, |
| CompatData: compatData, |
| ConvertData: convertData, |
| } |