github.com/bluenviron/gomavlib/v2@v2.2.1-0.20240308101627-2c07e3da629c/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  }