github.com/ShaleApps/viper@v1.15.1-concurrent/internal/encoding/toml/codec_test.go (about)

     1  package toml
     2  
     3  import (
     4  	"reflect"
     5  	"testing"
     6  )
     7  
     8  // original form of the data
     9  const original = `# key-value pair
    10  key = "value"
    11  list = ["item1", "item2", "item3"]
    12  
    13  [map]
    14  key = "value"
    15  
    16  # nested
    17  # map
    18  [nested_map]
    19  [nested_map.map]
    20  key = "value"
    21  list = [
    22    "item1",
    23    "item2",
    24    "item3",
    25  ]
    26  `
    27  
    28  // encoded form of the data
    29  const encoded = `key = 'value'
    30  list = ['item1', 'item2', 'item3']
    31  
    32  [map]
    33  key = 'value'
    34  
    35  [nested_map]
    36  [nested_map.map]
    37  key = 'value'
    38  list = ['item1', 'item2', 'item3']
    39  `
    40  
    41  // Viper's internal representation
    42  var data = map[string]interface{}{
    43  	"key": "value",
    44  	"list": []interface{}{
    45  		"item1",
    46  		"item2",
    47  		"item3",
    48  	},
    49  	"map": map[string]interface{}{
    50  		"key": "value",
    51  	},
    52  	"nested_map": map[string]interface{}{
    53  		"map": map[string]interface{}{
    54  			"key": "value",
    55  			"list": []interface{}{
    56  				"item1",
    57  				"item2",
    58  				"item3",
    59  			},
    60  		},
    61  	},
    62  }
    63  
    64  func TestCodec_Encode(t *testing.T) {
    65  	codec := Codec{}
    66  
    67  	b, err := codec.Encode(data)
    68  	if err != nil {
    69  		t.Fatal(err)
    70  	}
    71  
    72  	if encoded != string(b) {
    73  		t.Fatalf("decoded value does not match the expected one\nactual:   %#v\nexpected: %#v", string(b), encoded)
    74  	}
    75  }
    76  
    77  func TestCodec_Decode(t *testing.T) {
    78  	t.Run("OK", func(t *testing.T) {
    79  		codec := Codec{}
    80  
    81  		v := map[string]interface{}{}
    82  
    83  		err := codec.Decode([]byte(original), v)
    84  		if err != nil {
    85  			t.Fatal(err)
    86  		}
    87  
    88  		if !reflect.DeepEqual(data, v) {
    89  			t.Fatalf("decoded value does not match the expected one\nactual:   %#v\nexpected: %#v", v, data)
    90  		}
    91  	})
    92  
    93  	t.Run("InvalidData", func(t *testing.T) {
    94  		codec := Codec{}
    95  
    96  		v := map[string]interface{}{}
    97  
    98  		err := codec.Decode([]byte(`invalid data`), v)
    99  		if err == nil {
   100  			t.Fatal("expected decoding to fail")
   101  		}
   102  
   103  		t.Logf("decoding failed as expected: %s", err)
   104  	})
   105  }