github.com/qiniu/dyn@v1.3.0/dyn/dyn_test.go (about)

     1  package dyn
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/qiniu/x/log"
     7  	"github.com/qiniu/x/ts"
     8  )
     9  
    10  func init() {
    11  	log.SetOutputLevel(0)
    12  }
    13  
    14  // ----------------------------------------------------------
    15  
    16  type M map[string]interface{}
    17  type M2 map[string]interface{}
    18  
    19  func TestFuncGet(t *testing.T) {
    20  
    21  	c1 := 1
    22  	data := M{
    23  		"a": 1,
    24  		"b": func() interface{} {
    25  			return map[string]interface{}{
    26  				"c": func() interface{} {
    27  					c1++
    28  					return c1
    29  				},
    30  			}
    31  		},
    32  		"d": nil,
    33  		"e": "123",
    34  		"f": M2{
    35  			"g": 456,
    36  		},
    37  	}
    38  
    39  	_, ok := Get(nil, "a")
    40  	if ok {
    41  		ts.Fatal(t, "a?")
    42  	}
    43  
    44  	cc, ok := Get(data, "b.c")
    45  	if !ok || cc == nil {
    46  		ts.Fatal(t, "b.c:", cc, ok)
    47  	}
    48  
    49  	c, ok := GetInt(data, "b.c")
    50  	if !ok || c != 2 {
    51  		ts.Fatal(t, "b.c != 2", c, ok)
    52  	}
    53  
    54  	c2, ok := GetFloat(data, "b.c")
    55  	if !ok || c2 != 3 {
    56  		ts.Fatal(t, "b.c != 3")
    57  	}
    58  
    59  	_, ok = GetFloat(data, "d")
    60  	if ok {
    61  		ts.Fatal(t, "d is float?")
    62  	}
    63  
    64  	_, ok = GetString(data, "d")
    65  	if ok {
    66  		ts.Fatal(t, "a is string?")
    67  	}
    68  }
    69  
    70  // ----------------------------------------------------------
    71  
    72  func TestMapGet(t *testing.T) {
    73  
    74  	data := map[string]interface{}{
    75  		"a": 1,
    76  		"b": map[string]interface{}{
    77  			"c": 2,
    78  		},
    79  		"d": nil,
    80  	}
    81  
    82  	_, ok := Get(nil, "a")
    83  	if ok {
    84  		ts.Fatal(t, "a?")
    85  	}
    86  
    87  	c, ok := GetInt(data, "b.c")
    88  	if !ok || c != 2 {
    89  		ts.Fatal(t, "b.c != 2")
    90  	}
    91  
    92  	c2, ok := GetFloat(data, "b.c")
    93  	if !ok || c2 != 2 {
    94  		ts.Fatal(t, "b.c != 2")
    95  	}
    96  
    97  	_, ok = GetFloat(data, "d")
    98  	if ok {
    99  		ts.Fatal(t, "d is float?")
   100  	}
   101  
   102  	_, ok = GetString(data, "d")
   103  	if ok {
   104  		ts.Fatal(t, "a is string?")
   105  	}
   106  }
   107  
   108  // ----------------------------------------------------------
   109  
   110  type bar struct {
   111  	C int `json:"c"`
   112  }
   113  
   114  type foo struct {
   115  	A int         `json:"a"`
   116  	B bar         `json:"b"`
   117  	D interface{} `json:"d"`
   118  }
   119  
   120  func TestStructGet(t *testing.T) {
   121  
   122  	data := &foo{
   123  		A: 1,
   124  		B: bar{
   125  			C: 2,
   126  		},
   127  		D: nil,
   128  	}
   129  
   130  	_, ok := Get(nil, "a")
   131  	if ok {
   132  		ts.Fatal(t, "a?")
   133  	}
   134  
   135  	c, ok := GetInt(data, "b.c")
   136  	if !ok || c != 2 {
   137  		ts.Fatal(t, "b.c != 2, b.c =", c, ok)
   138  	}
   139  
   140  	c2, ok := GetFloat(data, "b.c")
   141  	if !ok || c2 != 2 {
   142  		ts.Fatal(t, "b.c != 2")
   143  	}
   144  
   145  	_, ok = GetFloat(data, "d")
   146  	if ok {
   147  		ts.Fatal(t, "d is float?")
   148  	}
   149  
   150  	_, ok = GetString(data, "d")
   151  	if ok {
   152  		ts.Fatal(t, "a is string?")
   153  	}
   154  }
   155  
   156  // ----------------------------------------------------------
   157  
   158  func TestArrayGet(t *testing.T) {
   159  
   160  	data := []interface{}{
   161  		5,
   162  		"a",
   163  		map[string]interface{}{
   164  			"c": 2,
   165  		},
   166  		[]int{1, 3},
   167  	}
   168  
   169  	c, ok := GetInt(data, "0")
   170  	if !ok || c != 5 {
   171  		ts.Fatal(t, "0 != 5")
   172  	}
   173  
   174  	c1, ok := GetString(data, "1")
   175  	if !ok || c1 != "a" {
   176  		ts.Fatal(t, "1 != a")
   177  	}
   178  
   179  	c2, ok := GetInt(data, "2.c")
   180  	if !ok || c2 != 2 {
   181  		ts.Fatal(t, "2.c != 2")
   182  	}
   183  
   184  	c3, ok := GetInt(data, "3.1")
   185  	if !ok || c3 != 3 {
   186  		ts.Fatal(t, "3.1 != 3")
   187  	}
   188  }
   189  
   190  // ----------------------------------------------------------