github.com/blp1526/goa@v1.4.0/goagen/codegen/finalizer_test.go (about) 1 package codegen_test 2 3 import ( 4 "github.com/goadesign/goa/design" 5 "github.com/goadesign/goa/goagen/codegen" 6 . "github.com/onsi/ginkgo" 7 . "github.com/onsi/gomega" 8 ) 9 10 var _ = Describe("Struct finalize code generation", func() { 11 var ( 12 att *design.AttributeDefinition 13 target string 14 finalizer *codegen.Finalizer 15 ) 16 17 BeforeEach(func() { 18 finalizer = codegen.NewFinalizer() 19 }) 20 21 Context("given an object with a primitive field", func() { 22 BeforeEach(func() { 23 att = &design.AttributeDefinition{ 24 Type: &design.Object{ 25 "foo": &design.AttributeDefinition{ 26 Type: design.String, 27 DefaultValue: "bar", 28 }, 29 }, 30 } 31 target = "ut" 32 }) 33 It("finalizes the fields", func() { 34 code := finalizer.Code(att, target, 0) 35 Ω(code).Should(Equal(primitiveAssignmentCode)) 36 }) 37 }) 38 39 Context("given an object with a primitive Number field", func() { 40 BeforeEach(func() { 41 att = &design.AttributeDefinition{ 42 Type: &design.Object{ 43 "foo": &design.AttributeDefinition{ 44 Type: design.Number, 45 DefaultValue: 0.0, 46 }, 47 }, 48 } 49 target = "ut" 50 }) 51 It("finalizes the fields", func() { 52 code := finalizer.Code(att, target, 0) 53 Ω(code).Should(Equal(numberAssignmentCode)) 54 }) 55 }) 56 57 Context("given an object with a primitive Number field with a int default value", func() { 58 BeforeEach(func() { 59 att = &design.AttributeDefinition{ 60 Type: &design.Object{ 61 "foo": &design.AttributeDefinition{ 62 Type: design.Number, 63 DefaultValue: 50, 64 }, 65 }, 66 } 67 target = "ut" 68 }) 69 It("finalizes the fields", func() { 70 code := finalizer.Code(att, target, 0) 71 Ω(code).Should(Equal(numberAssignmentCodeIntDefault)) 72 }) 73 }) 74 75 Context("given an array field", func() { 76 BeforeEach(func() { 77 att = &design.AttributeDefinition{ 78 Type: &design.Object{ 79 "foo": &design.AttributeDefinition{ 80 Type: &design.Array{ 81 ElemType: &design.AttributeDefinition{ 82 Type: design.String, 83 }, 84 }, 85 DefaultValue: []interface{}{"bar", "baz"}, 86 }, 87 }, 88 } 89 target = "ut" 90 }) 91 It("finalizes the array fields", func() { 92 code := finalizer.Code(att, target, 0) 93 Ω(code).Should(Equal(arrayAssignmentCode)) 94 }) 95 }) 96 97 Context("given a hash field", func() { 98 BeforeEach(func() { 99 att = &design.AttributeDefinition{ 100 Type: &design.Object{ 101 "foo": &design.AttributeDefinition{ 102 Type: &design.Hash{ 103 KeyType: &design.AttributeDefinition{ 104 Type: design.String, 105 }, 106 ElemType: &design.AttributeDefinition{ 107 Type: design.String, 108 }, 109 }, 110 DefaultValue: map[interface{}]interface{}{"bar": "baz"}, 111 }, 112 }, 113 } 114 target = "ut" 115 }) 116 Context("given a datetime field", func() { 117 BeforeEach(func() { 118 att = &design.AttributeDefinition{ 119 Type: &design.Object{ 120 "foo": &design.AttributeDefinition{ 121 Type: design.DateTime, 122 DefaultValue: interface{}("1978-06-30T10:00:00+09:00"), 123 }, 124 }, 125 } 126 target = "ut" 127 }) 128 It("finalizes the hash fields", func() { 129 code := finalizer.Code(att, target, 0) 130 Ω(code).Should(Equal(datetimeAssignmentCode)) 131 }) 132 }) 133 134 It("finalizes the recursive type fields", func() { 135 code := finalizer.Code(att, target, 0) 136 Ω(code).Should(Equal(recursiveAssignmentCodeA)) 137 }) 138 }) 139 140 Context("given a recursive user type with an array attribute", func() { 141 BeforeEach(func() { 142 var ( 143 rt = &design.UserTypeDefinition{TypeName: "recursive"} 144 ar = &design.Array{ElemType: &design.AttributeDefinition{Type: rt}} 145 obj = &design.Object{ 146 "elems": &design.AttributeDefinition{Type: ar}, 147 "other": &design.AttributeDefinition{ 148 Type: design.String, 149 DefaultValue: "foo", 150 }, 151 } 152 ) 153 rt.AttributeDefinition = &design.AttributeDefinition{Type: obj} 154 155 att = &design.AttributeDefinition{Type: rt} 156 target = "ut" 157 }) 158 It("finalizes the recursive type fields", func() { 159 code := finalizer.Code(att, target, 0) 160 Ω(code).Should(Equal(recursiveAssignmentCodeB)) 161 }) 162 }) 163 }) 164 165 const ( 166 primitiveAssignmentCode = `var defaultFoo = "bar" 167 if ut.Foo == nil { 168 ut.Foo = &defaultFoo 169 }` 170 171 numberAssignmentCodeIntDefault = `var defaultFoo = 50.000000 172 if ut.Foo == nil { 173 ut.Foo = &defaultFoo 174 }` 175 176 numberAssignmentCode = `var defaultFoo = 0.000000 177 if ut.Foo == nil { 178 ut.Foo = &defaultFoo 179 }` 180 181 arrayAssignmentCode = `if ut.Foo == nil { 182 ut.Foo = []string{"bar", "baz"} 183 }` 184 185 hashAssignmentCode = `if ut.Foo == nil { 186 ut.Foo = map[string]string{"bar": "baz"} 187 }` 188 datetimeAssignmentCode = `var defaultFoo, _ = time.Parse(time.RFC3339, "1978-06-30T10:00:00+09:00") 189 if ut.Foo == nil { 190 ut.Foo = &defaultFoo 191 }` 192 193 recursiveAssignmentCodeA = `if ut.Foo == nil { 194 ut.Foo = map[string]string{"bar": "baz"} 195 }` 196 197 recursiveAssignmentCodeB = ` for _, e := range ut.Elems { 198 var defaultOther = "foo" 199 if e.Other == nil { 200 e.Other = &defaultOther 201 } 202 } 203 var defaultOther = "foo" 204 if ut.Other == nil { 205 ut.Other = &defaultOther 206 }` 207 )