github.com/bluenviron/gomavlib/v3@v3.0.0/pkg/conversion/conversion_test.go (about) 1 package conversion 2 3 import ( 4 "os" 5 "testing" 6 7 "github.com/stretchr/testify/require" 8 ) 9 10 const testDialect = `<?xml version="1.0"?> 11 <mavlink> 12 <version>0</version> 13 <dialect>0</dialect> 14 <enums> 15 <enum name="A_TYPE"> 16 <description>Detected Anomaly Types.</description> 17 <entry value="0" name="A"> 18 <description>A.</description> 19 </entry> 20 <entry value="1" name="B"> 21 <description>B.</description> 22 </entry> 23 <entry value="2" name="C"> 24 <description>C.</description> 25 </entry> 26 <entry value="3" name="D"> 27 <description>D.</description> 28 </entry> 29 <entry value="4" name="E"> 30 <description>E</description> 31 </entry> 32 <entry value="1" name="BIT0" /> 33 <entry value="2**4" name="BIT4" /> 34 <entry value="0b000100000000" name="BIT8" /> 35 <entry value="0x10000" name="BIT16" /> 36 <entry value="0b1000000000000000000000000000000000000000000000000000000000000" name="BIT60" /> 37 <entry value="2305843009213693952" name="BIT61" /> 38 <entry value="2**62" name="BIT62" /> 39 <entry value="0x8000000000000000" name="BIT63" /> 40 </enum> 41 </enums> 42 <messages> 43 <message id="43000" name="A_MESSAGE"> 44 <description>Detected anomaly info measured by onboard sensors and actuators. </description> 45 <field type="uint8_t" name="test_uint8" enum="A_TYPE">a test uint8</field> 46 <field type="char[16]" name="Test_string">a test string</field> 47 <field type="uint32_t[4]" name="test_array">a test array</field> 48 <extensions/> 49 <field type="uint8_t" name="mission_type" enum="MAV_MISSION_TYPE">a test extension</field> 50 </message> 51 </messages> 52 </mavlink> 53 ` 54 55 var testMessageGo = `//autogenerated:yes 56 //nolint:revive,misspell,govet,lll 57 package testdialect 58 // Detected anomaly info measured by onboard sensors and actuators. 59 type MessageAMessage struct { 60 // a test uint8 61 TestUint8 A_TYPE ` + "`" + `mavenum:"uint8"` + "`" + ` 62 // a test string 63 TestString string ` + "`" + `mavlen:"16" mavname:"Test_string"` + "`" + ` 64 // a test array 65 TestArray [4]uint32 66 // a test extension 67 MissionType MAV_MISSION_TYPE ` + "`" + `mavenum:"uint8" mavext:"true"` + "`" + ` 68 } 69 70 // GetID implements the message.Message interface. 71 func (*MessageAMessage) GetID() uint32 { 72 return 43000 73 } 74 ` 75 76 var testEnumGo = `//autogenerated:yes 77 //nolint:revive,misspell,govet,lll,dupl,gocritic 78 package testdialect 79 80 import ( 81 "strconv" 82 "fmt" 83 ) 84 // Detected Anomaly Types. 85 type A_TYPE uint64 86 87 const ( 88 // A. 89 A A_TYPE = 0 90 // B. 91 B A_TYPE = 1 92 // C. 93 C A_TYPE = 2 94 // D. 95 D A_TYPE = 3 96 // E 97 E A_TYPE = 4 98 BIT0 A_TYPE = 1 99 BIT4 A_TYPE = 16 100 BIT8 A_TYPE = 256 101 BIT16 A_TYPE = 65536 102 BIT60 A_TYPE = 1152921504606846976 103 BIT61 A_TYPE = 2305843009213693952 104 BIT62 A_TYPE = 4611686018427387904 105 BIT63 A_TYPE = 9223372036854775808 106 ) 107 108 var labels_A_TYPE = map[A_TYPE]string{ 109 A: "A", 110 B: "B", 111 C: "C", 112 D: "D", 113 E: "E", 114 BIT0: "BIT0", 115 BIT4: "BIT4", 116 BIT8: "BIT8", 117 BIT16: "BIT16", 118 BIT60: "BIT60", 119 BIT61: "BIT61", 120 BIT62: "BIT62", 121 BIT63: "BIT63", 122 } 123 124 var values_A_TYPE = map[string]A_TYPE{ 125 "A": A, 126 "B": B, 127 "C": C, 128 "D": D, 129 "E": E, 130 "BIT0": BIT0, 131 "BIT4": BIT4, 132 "BIT8": BIT8, 133 "BIT16": BIT16, 134 "BIT60": BIT60, 135 "BIT61": BIT61, 136 "BIT62": BIT62, 137 "BIT63": BIT63, 138 } 139 140 // MarshalText implements the encoding.TextMarshaler interface. 141 func (e A_TYPE) MarshalText() ([]byte, error) { 142 if name, ok := labels_A_TYPE[e]; ok { 143 return []byte(name), nil 144 } 145 return []byte(strconv.Itoa(int(e))), nil 146 } 147 148 // UnmarshalText implements the encoding.TextUnmarshaler interface. 149 func (e *A_TYPE) UnmarshalText(text []byte) error { 150 if value, ok := values_A_TYPE[string(text)]; ok { 151 *e = value 152 } else if value, err := strconv.Atoi(string(text)); err == nil { 153 *e = A_TYPE(value) 154 } else { 155 return fmt.Errorf("invalid label '%s'", text) 156 } 157 return nil 158 } 159 160 // String implements the fmt.Stringer interface. 161 func (e A_TYPE) String() string { 162 val, _ := e.MarshalText() 163 return string(val) 164 } 165 ` 166 167 func TestConversion(t *testing.T) { 168 dir, err := os.MkdirTemp("", "gomavlib") 169 require.NoError(t, err) 170 defer os.RemoveAll(dir) 171 172 os.Chdir(dir) 173 174 err = os.WriteFile("testdialect.xml", []byte(testDialect), 0o644) 175 require.NoError(t, err) 176 177 err = Convert("testdialect.xml", true) 178 require.NoError(t, err) 179 180 buf, err := os.ReadFile("testdialect/message_a_message.go") 181 require.NoError(t, err) 182 require.Equal(t, testMessageGo, string(buf)) 183 184 buf, err = os.ReadFile("testdialect/enum_a_type.go") 185 require.NoError(t, err) 186 require.Equal(t, testEnumGo, string(buf)) 187 }