1*1fa6dee9SAndroid Build Coastguard Worker// Copyright 2015 Google Inc. All rights reserved. 2*1fa6dee9SAndroid Build Coastguard Worker// 3*1fa6dee9SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*1fa6dee9SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*1fa6dee9SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*1fa6dee9SAndroid Build Coastguard Worker// 7*1fa6dee9SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*1fa6dee9SAndroid Build Coastguard Worker// 9*1fa6dee9SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*1fa6dee9SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*1fa6dee9SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*1fa6dee9SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*1fa6dee9SAndroid Build Coastguard Worker// limitations under the License. 14*1fa6dee9SAndroid Build Coastguard Worker 15*1fa6dee9SAndroid Build Coastguard Workerpackage proptools 16*1fa6dee9SAndroid Build Coastguard Worker 17*1fa6dee9SAndroid Build Coastguard Workerimport ( 18*1fa6dee9SAndroid Build Coastguard Worker "errors" 19*1fa6dee9SAndroid Build Coastguard Worker "fmt" 20*1fa6dee9SAndroid Build Coastguard Worker "reflect" 21*1fa6dee9SAndroid Build Coastguard Worker "strings" 22*1fa6dee9SAndroid Build Coastguard Worker "testing" 23*1fa6dee9SAndroid Build Coastguard Worker 24*1fa6dee9SAndroid Build Coastguard Worker "github.com/google/blueprint/parser" 25*1fa6dee9SAndroid Build Coastguard Worker) 26*1fa6dee9SAndroid Build Coastguard Worker 27*1fa6dee9SAndroid Build Coastguard Workertype appendPropertyTestCase struct { 28*1fa6dee9SAndroid Build Coastguard Worker name string 29*1fa6dee9SAndroid Build Coastguard Worker dst interface{} 30*1fa6dee9SAndroid Build Coastguard Worker src interface{} 31*1fa6dee9SAndroid Build Coastguard Worker out interface{} 32*1fa6dee9SAndroid Build Coastguard Worker order Order // default is Append 33*1fa6dee9SAndroid Build Coastguard Worker filter ExtendPropertyFilterFunc 34*1fa6dee9SAndroid Build Coastguard Worker err error 35*1fa6dee9SAndroid Build Coastguard Worker} 36*1fa6dee9SAndroid Build Coastguard Worker 37*1fa6dee9SAndroid Build Coastguard Workerfunc appendPropertiesTestCases() []appendPropertyTestCase { 38*1fa6dee9SAndroid Build Coastguard Worker return []appendPropertyTestCase{ 39*1fa6dee9SAndroid Build Coastguard Worker // Valid inputs 40*1fa6dee9SAndroid Build Coastguard Worker 41*1fa6dee9SAndroid Build Coastguard Worker { 42*1fa6dee9SAndroid Build Coastguard Worker name: "Append bool", 43*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ B1, B2, B3, B4 bool }{ 44*1fa6dee9SAndroid Build Coastguard Worker B1: true, 45*1fa6dee9SAndroid Build Coastguard Worker B2: false, 46*1fa6dee9SAndroid Build Coastguard Worker B3: true, 47*1fa6dee9SAndroid Build Coastguard Worker B4: false, 48*1fa6dee9SAndroid Build Coastguard Worker }, 49*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ B1, B2, B3, B4 bool }{ 50*1fa6dee9SAndroid Build Coastguard Worker B1: true, 51*1fa6dee9SAndroid Build Coastguard Worker B2: true, 52*1fa6dee9SAndroid Build Coastguard Worker B3: false, 53*1fa6dee9SAndroid Build Coastguard Worker B4: false, 54*1fa6dee9SAndroid Build Coastguard Worker }, 55*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ B1, B2, B3, B4 bool }{ 56*1fa6dee9SAndroid Build Coastguard Worker B1: true, 57*1fa6dee9SAndroid Build Coastguard Worker B2: true, 58*1fa6dee9SAndroid Build Coastguard Worker B3: true, 59*1fa6dee9SAndroid Build Coastguard Worker B4: false, 60*1fa6dee9SAndroid Build Coastguard Worker }, 61*1fa6dee9SAndroid Build Coastguard Worker }, 62*1fa6dee9SAndroid Build Coastguard Worker { 63*1fa6dee9SAndroid Build Coastguard Worker name: "Prepend bool", 64*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ B1, B2, B3, B4 bool }{ 65*1fa6dee9SAndroid Build Coastguard Worker B1: true, 66*1fa6dee9SAndroid Build Coastguard Worker B2: false, 67*1fa6dee9SAndroid Build Coastguard Worker B3: true, 68*1fa6dee9SAndroid Build Coastguard Worker B4: false, 69*1fa6dee9SAndroid Build Coastguard Worker }, 70*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ B1, B2, B3, B4 bool }{ 71*1fa6dee9SAndroid Build Coastguard Worker B1: true, 72*1fa6dee9SAndroid Build Coastguard Worker B2: true, 73*1fa6dee9SAndroid Build Coastguard Worker B3: false, 74*1fa6dee9SAndroid Build Coastguard Worker B4: false, 75*1fa6dee9SAndroid Build Coastguard Worker }, 76*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ B1, B2, B3, B4 bool }{ 77*1fa6dee9SAndroid Build Coastguard Worker B1: true, 78*1fa6dee9SAndroid Build Coastguard Worker B2: true, 79*1fa6dee9SAndroid Build Coastguard Worker B3: true, 80*1fa6dee9SAndroid Build Coastguard Worker B4: false, 81*1fa6dee9SAndroid Build Coastguard Worker }, 82*1fa6dee9SAndroid Build Coastguard Worker order: Prepend, 83*1fa6dee9SAndroid Build Coastguard Worker }, 84*1fa6dee9SAndroid Build Coastguard Worker { 85*1fa6dee9SAndroid Build Coastguard Worker name: "Append strings", 86*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S string }{ 87*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 88*1fa6dee9SAndroid Build Coastguard Worker }, 89*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S string }{ 90*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 91*1fa6dee9SAndroid Build Coastguard Worker }, 92*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S string }{ 93*1fa6dee9SAndroid Build Coastguard Worker S: "string1string2", 94*1fa6dee9SAndroid Build Coastguard Worker }, 95*1fa6dee9SAndroid Build Coastguard Worker }, 96*1fa6dee9SAndroid Build Coastguard Worker { 97*1fa6dee9SAndroid Build Coastguard Worker name: "Prepend strings", 98*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S string }{ 99*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 100*1fa6dee9SAndroid Build Coastguard Worker }, 101*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S string }{ 102*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 103*1fa6dee9SAndroid Build Coastguard Worker }, 104*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S string }{ 105*1fa6dee9SAndroid Build Coastguard Worker S: "string2string1", 106*1fa6dee9SAndroid Build Coastguard Worker }, 107*1fa6dee9SAndroid Build Coastguard Worker order: Prepend, 108*1fa6dee9SAndroid Build Coastguard Worker }, 109*1fa6dee9SAndroid Build Coastguard Worker { 110*1fa6dee9SAndroid Build Coastguard Worker name: "Append pointer to bool", 111*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ B1, B2, B3, B4, B5, B6, B7, B8, B9 *bool }{ 112*1fa6dee9SAndroid Build Coastguard Worker B1: BoolPtr(true), 113*1fa6dee9SAndroid Build Coastguard Worker B2: BoolPtr(false), 114*1fa6dee9SAndroid Build Coastguard Worker B3: nil, 115*1fa6dee9SAndroid Build Coastguard Worker B4: BoolPtr(true), 116*1fa6dee9SAndroid Build Coastguard Worker B5: BoolPtr(false), 117*1fa6dee9SAndroid Build Coastguard Worker B6: nil, 118*1fa6dee9SAndroid Build Coastguard Worker B7: BoolPtr(true), 119*1fa6dee9SAndroid Build Coastguard Worker B8: BoolPtr(false), 120*1fa6dee9SAndroid Build Coastguard Worker B9: nil, 121*1fa6dee9SAndroid Build Coastguard Worker }, 122*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ B1, B2, B3, B4, B5, B6, B7, B8, B9 *bool }{ 123*1fa6dee9SAndroid Build Coastguard Worker B1: nil, 124*1fa6dee9SAndroid Build Coastguard Worker B2: nil, 125*1fa6dee9SAndroid Build Coastguard Worker B3: nil, 126*1fa6dee9SAndroid Build Coastguard Worker B4: BoolPtr(true), 127*1fa6dee9SAndroid Build Coastguard Worker B5: BoolPtr(true), 128*1fa6dee9SAndroid Build Coastguard Worker B6: BoolPtr(true), 129*1fa6dee9SAndroid Build Coastguard Worker B7: BoolPtr(false), 130*1fa6dee9SAndroid Build Coastguard Worker B8: BoolPtr(false), 131*1fa6dee9SAndroid Build Coastguard Worker B9: BoolPtr(false), 132*1fa6dee9SAndroid Build Coastguard Worker }, 133*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ B1, B2, B3, B4, B5, B6, B7, B8, B9 *bool }{ 134*1fa6dee9SAndroid Build Coastguard Worker B1: BoolPtr(true), 135*1fa6dee9SAndroid Build Coastguard Worker B2: BoolPtr(false), 136*1fa6dee9SAndroid Build Coastguard Worker B3: nil, 137*1fa6dee9SAndroid Build Coastguard Worker B4: BoolPtr(true), 138*1fa6dee9SAndroid Build Coastguard Worker B5: BoolPtr(true), 139*1fa6dee9SAndroid Build Coastguard Worker B6: BoolPtr(true), 140*1fa6dee9SAndroid Build Coastguard Worker B7: BoolPtr(false), 141*1fa6dee9SAndroid Build Coastguard Worker B8: BoolPtr(false), 142*1fa6dee9SAndroid Build Coastguard Worker B9: BoolPtr(false), 143*1fa6dee9SAndroid Build Coastguard Worker }, 144*1fa6dee9SAndroid Build Coastguard Worker }, 145*1fa6dee9SAndroid Build Coastguard Worker { 146*1fa6dee9SAndroid Build Coastguard Worker name: "Prepend pointer to bool", 147*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ B1, B2, B3, B4, B5, B6, B7, B8, B9 *bool }{ 148*1fa6dee9SAndroid Build Coastguard Worker B1: BoolPtr(true), 149*1fa6dee9SAndroid Build Coastguard Worker B2: BoolPtr(false), 150*1fa6dee9SAndroid Build Coastguard Worker B3: nil, 151*1fa6dee9SAndroid Build Coastguard Worker B4: BoolPtr(true), 152*1fa6dee9SAndroid Build Coastguard Worker B5: BoolPtr(false), 153*1fa6dee9SAndroid Build Coastguard Worker B6: nil, 154*1fa6dee9SAndroid Build Coastguard Worker B7: BoolPtr(true), 155*1fa6dee9SAndroid Build Coastguard Worker B8: BoolPtr(false), 156*1fa6dee9SAndroid Build Coastguard Worker B9: nil, 157*1fa6dee9SAndroid Build Coastguard Worker }, 158*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ B1, B2, B3, B4, B5, B6, B7, B8, B9 *bool }{ 159*1fa6dee9SAndroid Build Coastguard Worker B1: nil, 160*1fa6dee9SAndroid Build Coastguard Worker B2: nil, 161*1fa6dee9SAndroid Build Coastguard Worker B3: nil, 162*1fa6dee9SAndroid Build Coastguard Worker B4: BoolPtr(true), 163*1fa6dee9SAndroid Build Coastguard Worker B5: BoolPtr(true), 164*1fa6dee9SAndroid Build Coastguard Worker B6: BoolPtr(true), 165*1fa6dee9SAndroid Build Coastguard Worker B7: BoolPtr(false), 166*1fa6dee9SAndroid Build Coastguard Worker B8: BoolPtr(false), 167*1fa6dee9SAndroid Build Coastguard Worker B9: BoolPtr(false), 168*1fa6dee9SAndroid Build Coastguard Worker }, 169*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ B1, B2, B3, B4, B5, B6, B7, B8, B9 *bool }{ 170*1fa6dee9SAndroid Build Coastguard Worker B1: BoolPtr(true), 171*1fa6dee9SAndroid Build Coastguard Worker B2: BoolPtr(false), 172*1fa6dee9SAndroid Build Coastguard Worker B3: nil, 173*1fa6dee9SAndroid Build Coastguard Worker B4: BoolPtr(true), 174*1fa6dee9SAndroid Build Coastguard Worker B5: BoolPtr(false), 175*1fa6dee9SAndroid Build Coastguard Worker B6: BoolPtr(true), 176*1fa6dee9SAndroid Build Coastguard Worker B7: BoolPtr(true), 177*1fa6dee9SAndroid Build Coastguard Worker B8: BoolPtr(false), 178*1fa6dee9SAndroid Build Coastguard Worker B9: BoolPtr(false), 179*1fa6dee9SAndroid Build Coastguard Worker }, 180*1fa6dee9SAndroid Build Coastguard Worker order: Prepend, 181*1fa6dee9SAndroid Build Coastguard Worker }, 182*1fa6dee9SAndroid Build Coastguard Worker { 183*1fa6dee9SAndroid Build Coastguard Worker name: "Append pointer to integer", 184*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ I1, I2, I3, I4, I5, I6, I7, I8, I9 *int64 }{ 185*1fa6dee9SAndroid Build Coastguard Worker I1: Int64Ptr(55), 186*1fa6dee9SAndroid Build Coastguard Worker I2: Int64Ptr(-3), 187*1fa6dee9SAndroid Build Coastguard Worker I3: nil, 188*1fa6dee9SAndroid Build Coastguard Worker I4: Int64Ptr(100), 189*1fa6dee9SAndroid Build Coastguard Worker I5: Int64Ptr(33), 190*1fa6dee9SAndroid Build Coastguard Worker I6: nil, 191*1fa6dee9SAndroid Build Coastguard Worker I7: Int64Ptr(77), 192*1fa6dee9SAndroid Build Coastguard Worker I8: Int64Ptr(0), 193*1fa6dee9SAndroid Build Coastguard Worker I9: nil, 194*1fa6dee9SAndroid Build Coastguard Worker }, 195*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ I1, I2, I3, I4, I5, I6, I7, I8, I9 *int64 }{ 196*1fa6dee9SAndroid Build Coastguard Worker I1: nil, 197*1fa6dee9SAndroid Build Coastguard Worker I2: nil, 198*1fa6dee9SAndroid Build Coastguard Worker I3: nil, 199*1fa6dee9SAndroid Build Coastguard Worker I4: Int64Ptr(1), 200*1fa6dee9SAndroid Build Coastguard Worker I5: Int64Ptr(-2), 201*1fa6dee9SAndroid Build Coastguard Worker I6: Int64Ptr(8), 202*1fa6dee9SAndroid Build Coastguard Worker I7: Int64Ptr(9), 203*1fa6dee9SAndroid Build Coastguard Worker I8: Int64Ptr(10), 204*1fa6dee9SAndroid Build Coastguard Worker I9: Int64Ptr(11), 205*1fa6dee9SAndroid Build Coastguard Worker }, 206*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ I1, I2, I3, I4, I5, I6, I7, I8, I9 *int64 }{ 207*1fa6dee9SAndroid Build Coastguard Worker I1: Int64Ptr(55), 208*1fa6dee9SAndroid Build Coastguard Worker I2: Int64Ptr(-3), 209*1fa6dee9SAndroid Build Coastguard Worker I3: nil, 210*1fa6dee9SAndroid Build Coastguard Worker I4: Int64Ptr(1), 211*1fa6dee9SAndroid Build Coastguard Worker I5: Int64Ptr(-2), 212*1fa6dee9SAndroid Build Coastguard Worker I6: Int64Ptr(8), 213*1fa6dee9SAndroid Build Coastguard Worker I7: Int64Ptr(9), 214*1fa6dee9SAndroid Build Coastguard Worker I8: Int64Ptr(10), 215*1fa6dee9SAndroid Build Coastguard Worker I9: Int64Ptr(11), 216*1fa6dee9SAndroid Build Coastguard Worker }, 217*1fa6dee9SAndroid Build Coastguard Worker }, 218*1fa6dee9SAndroid Build Coastguard Worker { 219*1fa6dee9SAndroid Build Coastguard Worker name: "Prepend pointer to integer", 220*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ I1, I2, I3 *int64 }{ 221*1fa6dee9SAndroid Build Coastguard Worker I1: Int64Ptr(55), 222*1fa6dee9SAndroid Build Coastguard Worker I3: nil, 223*1fa6dee9SAndroid Build Coastguard Worker }, 224*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ I1, I2, I3 *int64 }{ 225*1fa6dee9SAndroid Build Coastguard Worker I2: Int64Ptr(33), 226*1fa6dee9SAndroid Build Coastguard Worker }, 227*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ I1, I2, I3 *int64 }{ 228*1fa6dee9SAndroid Build Coastguard Worker I1: Int64Ptr(55), 229*1fa6dee9SAndroid Build Coastguard Worker I2: Int64Ptr(33), 230*1fa6dee9SAndroid Build Coastguard Worker I3: nil, 231*1fa6dee9SAndroid Build Coastguard Worker }, 232*1fa6dee9SAndroid Build Coastguard Worker order: Prepend, 233*1fa6dee9SAndroid Build Coastguard Worker }, 234*1fa6dee9SAndroid Build Coastguard Worker { 235*1fa6dee9SAndroid Build Coastguard Worker name: "Append pointer to strings", 236*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S1, S2, S3, S4 *string }{ 237*1fa6dee9SAndroid Build Coastguard Worker S1: StringPtr("string1"), 238*1fa6dee9SAndroid Build Coastguard Worker S2: StringPtr("string2"), 239*1fa6dee9SAndroid Build Coastguard Worker }, 240*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S1, S2, S3, S4 *string }{ 241*1fa6dee9SAndroid Build Coastguard Worker S1: StringPtr("string3"), 242*1fa6dee9SAndroid Build Coastguard Worker S3: StringPtr("string4"), 243*1fa6dee9SAndroid Build Coastguard Worker }, 244*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S1, S2, S3, S4 *string }{ 245*1fa6dee9SAndroid Build Coastguard Worker S1: StringPtr("string3"), 246*1fa6dee9SAndroid Build Coastguard Worker S2: StringPtr("string2"), 247*1fa6dee9SAndroid Build Coastguard Worker S3: StringPtr("string4"), 248*1fa6dee9SAndroid Build Coastguard Worker S4: nil, 249*1fa6dee9SAndroid Build Coastguard Worker }, 250*1fa6dee9SAndroid Build Coastguard Worker }, 251*1fa6dee9SAndroid Build Coastguard Worker { 252*1fa6dee9SAndroid Build Coastguard Worker name: "Prepend pointer to strings", 253*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S1, S2, S3, S4 *string }{ 254*1fa6dee9SAndroid Build Coastguard Worker S1: StringPtr("string1"), 255*1fa6dee9SAndroid Build Coastguard Worker S2: StringPtr("string2"), 256*1fa6dee9SAndroid Build Coastguard Worker }, 257*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S1, S2, S3, S4 *string }{ 258*1fa6dee9SAndroid Build Coastguard Worker S1: StringPtr("string3"), 259*1fa6dee9SAndroid Build Coastguard Worker S3: StringPtr("string4"), 260*1fa6dee9SAndroid Build Coastguard Worker }, 261*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S1, S2, S3, S4 *string }{ 262*1fa6dee9SAndroid Build Coastguard Worker S1: StringPtr("string1"), 263*1fa6dee9SAndroid Build Coastguard Worker S2: StringPtr("string2"), 264*1fa6dee9SAndroid Build Coastguard Worker S3: StringPtr("string4"), 265*1fa6dee9SAndroid Build Coastguard Worker S4: nil, 266*1fa6dee9SAndroid Build Coastguard Worker }, 267*1fa6dee9SAndroid Build Coastguard Worker order: Prepend, 268*1fa6dee9SAndroid Build Coastguard Worker }, 269*1fa6dee9SAndroid Build Coastguard Worker { 270*1fa6dee9SAndroid Build Coastguard Worker name: "Append slice", 271*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S []string }{ 272*1fa6dee9SAndroid Build Coastguard Worker S: []string{"string1"}, 273*1fa6dee9SAndroid Build Coastguard Worker }, 274*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S []string }{ 275*1fa6dee9SAndroid Build Coastguard Worker S: []string{"string2"}, 276*1fa6dee9SAndroid Build Coastguard Worker }, 277*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S []string }{ 278*1fa6dee9SAndroid Build Coastguard Worker S: []string{"string1", "string2"}, 279*1fa6dee9SAndroid Build Coastguard Worker }, 280*1fa6dee9SAndroid Build Coastguard Worker }, 281*1fa6dee9SAndroid Build Coastguard Worker { 282*1fa6dee9SAndroid Build Coastguard Worker name: "Prepend slice", 283*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S []string }{ 284*1fa6dee9SAndroid Build Coastguard Worker S: []string{"string1"}, 285*1fa6dee9SAndroid Build Coastguard Worker }, 286*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S []string }{ 287*1fa6dee9SAndroid Build Coastguard Worker S: []string{"string2"}, 288*1fa6dee9SAndroid Build Coastguard Worker }, 289*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S []string }{ 290*1fa6dee9SAndroid Build Coastguard Worker S: []string{"string2", "string1"}, 291*1fa6dee9SAndroid Build Coastguard Worker }, 292*1fa6dee9SAndroid Build Coastguard Worker order: Prepend, 293*1fa6dee9SAndroid Build Coastguard Worker }, 294*1fa6dee9SAndroid Build Coastguard Worker { 295*1fa6dee9SAndroid Build Coastguard Worker name: "Replace slice", 296*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S []string }{ 297*1fa6dee9SAndroid Build Coastguard Worker S: []string{"string1"}, 298*1fa6dee9SAndroid Build Coastguard Worker }, 299*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S []string }{ 300*1fa6dee9SAndroid Build Coastguard Worker S: []string{"string2"}, 301*1fa6dee9SAndroid Build Coastguard Worker }, 302*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S []string }{ 303*1fa6dee9SAndroid Build Coastguard Worker S: []string{"string2"}, 304*1fa6dee9SAndroid Build Coastguard Worker }, 305*1fa6dee9SAndroid Build Coastguard Worker order: Replace, 306*1fa6dee9SAndroid Build Coastguard Worker }, 307*1fa6dee9SAndroid Build Coastguard Worker { 308*1fa6dee9SAndroid Build Coastguard Worker name: "Append empty slice", 309*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S1, S2 []string }{ 310*1fa6dee9SAndroid Build Coastguard Worker S1: []string{"string1"}, 311*1fa6dee9SAndroid Build Coastguard Worker S2: []string{}, 312*1fa6dee9SAndroid Build Coastguard Worker }, 313*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S1, S2 []string }{ 314*1fa6dee9SAndroid Build Coastguard Worker S1: []string{}, 315*1fa6dee9SAndroid Build Coastguard Worker S2: []string{"string2"}, 316*1fa6dee9SAndroid Build Coastguard Worker }, 317*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S1, S2 []string }{ 318*1fa6dee9SAndroid Build Coastguard Worker S1: []string{"string1"}, 319*1fa6dee9SAndroid Build Coastguard Worker S2: []string{"string2"}, 320*1fa6dee9SAndroid Build Coastguard Worker }, 321*1fa6dee9SAndroid Build Coastguard Worker }, 322*1fa6dee9SAndroid Build Coastguard Worker { 323*1fa6dee9SAndroid Build Coastguard Worker name: "Prepend empty slice", 324*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S1, S2 []string }{ 325*1fa6dee9SAndroid Build Coastguard Worker S1: []string{"string1"}, 326*1fa6dee9SAndroid Build Coastguard Worker S2: []string{}, 327*1fa6dee9SAndroid Build Coastguard Worker }, 328*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S1, S2 []string }{ 329*1fa6dee9SAndroid Build Coastguard Worker S1: []string{}, 330*1fa6dee9SAndroid Build Coastguard Worker S2: []string{"string2"}, 331*1fa6dee9SAndroid Build Coastguard Worker }, 332*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S1, S2 []string }{ 333*1fa6dee9SAndroid Build Coastguard Worker S1: []string{"string1"}, 334*1fa6dee9SAndroid Build Coastguard Worker S2: []string{"string2"}, 335*1fa6dee9SAndroid Build Coastguard Worker }, 336*1fa6dee9SAndroid Build Coastguard Worker order: Prepend, 337*1fa6dee9SAndroid Build Coastguard Worker }, 338*1fa6dee9SAndroid Build Coastguard Worker { 339*1fa6dee9SAndroid Build Coastguard Worker name: "Replace empty slice", 340*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S1, S2 []string }{ 341*1fa6dee9SAndroid Build Coastguard Worker S1: []string{"string1"}, 342*1fa6dee9SAndroid Build Coastguard Worker S2: []string{}, 343*1fa6dee9SAndroid Build Coastguard Worker }, 344*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S1, S2 []string }{ 345*1fa6dee9SAndroid Build Coastguard Worker S1: []string{}, 346*1fa6dee9SAndroid Build Coastguard Worker S2: []string{"string2"}, 347*1fa6dee9SAndroid Build Coastguard Worker }, 348*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S1, S2 []string }{ 349*1fa6dee9SAndroid Build Coastguard Worker S1: []string{}, 350*1fa6dee9SAndroid Build Coastguard Worker S2: []string{"string2"}, 351*1fa6dee9SAndroid Build Coastguard Worker }, 352*1fa6dee9SAndroid Build Coastguard Worker order: Replace, 353*1fa6dee9SAndroid Build Coastguard Worker }, 354*1fa6dee9SAndroid Build Coastguard Worker { 355*1fa6dee9SAndroid Build Coastguard Worker name: "Append nil slice", 356*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S1, S2, S3 []string }{ 357*1fa6dee9SAndroid Build Coastguard Worker S1: []string{"string1"}, 358*1fa6dee9SAndroid Build Coastguard Worker }, 359*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S1, S2, S3 []string }{ 360*1fa6dee9SAndroid Build Coastguard Worker S2: []string{"string2"}, 361*1fa6dee9SAndroid Build Coastguard Worker }, 362*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S1, S2, S3 []string }{ 363*1fa6dee9SAndroid Build Coastguard Worker S1: []string{"string1"}, 364*1fa6dee9SAndroid Build Coastguard Worker S2: []string{"string2"}, 365*1fa6dee9SAndroid Build Coastguard Worker S3: nil, 366*1fa6dee9SAndroid Build Coastguard Worker }, 367*1fa6dee9SAndroid Build Coastguard Worker }, 368*1fa6dee9SAndroid Build Coastguard Worker { 369*1fa6dee9SAndroid Build Coastguard Worker name: "Prepend nil slice", 370*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S1, S2, S3 []string }{ 371*1fa6dee9SAndroid Build Coastguard Worker S1: []string{"string1"}, 372*1fa6dee9SAndroid Build Coastguard Worker }, 373*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S1, S2, S3 []string }{ 374*1fa6dee9SAndroid Build Coastguard Worker S2: []string{"string2"}, 375*1fa6dee9SAndroid Build Coastguard Worker }, 376*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S1, S2, S3 []string }{ 377*1fa6dee9SAndroid Build Coastguard Worker S1: []string{"string1"}, 378*1fa6dee9SAndroid Build Coastguard Worker S2: []string{"string2"}, 379*1fa6dee9SAndroid Build Coastguard Worker S3: nil, 380*1fa6dee9SAndroid Build Coastguard Worker }, 381*1fa6dee9SAndroid Build Coastguard Worker order: Prepend, 382*1fa6dee9SAndroid Build Coastguard Worker }, 383*1fa6dee9SAndroid Build Coastguard Worker { 384*1fa6dee9SAndroid Build Coastguard Worker name: "Replace nil slice", 385*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S1, S2, S3 []string }{ 386*1fa6dee9SAndroid Build Coastguard Worker S1: []string{"string1"}, 387*1fa6dee9SAndroid Build Coastguard Worker }, 388*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S1, S2, S3 []string }{ 389*1fa6dee9SAndroid Build Coastguard Worker S2: []string{"string2"}, 390*1fa6dee9SAndroid Build Coastguard Worker }, 391*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S1, S2, S3 []string }{ 392*1fa6dee9SAndroid Build Coastguard Worker S1: []string{"string1"}, 393*1fa6dee9SAndroid Build Coastguard Worker S2: []string{"string2"}, 394*1fa6dee9SAndroid Build Coastguard Worker S3: nil, 395*1fa6dee9SAndroid Build Coastguard Worker }, 396*1fa6dee9SAndroid Build Coastguard Worker order: Replace, 397*1fa6dee9SAndroid Build Coastguard Worker }, 398*1fa6dee9SAndroid Build Coastguard Worker { 399*1fa6dee9SAndroid Build Coastguard Worker name: "Replace embedded slice", 400*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S *struct{ S1 []string } }{ 401*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S1 []string }{ 402*1fa6dee9SAndroid Build Coastguard Worker S1: []string{"string1"}, 403*1fa6dee9SAndroid Build Coastguard Worker }, 404*1fa6dee9SAndroid Build Coastguard Worker }, 405*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S *struct{ S1 []string } }{ 406*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S1 []string }{ 407*1fa6dee9SAndroid Build Coastguard Worker S1: []string{"string2"}, 408*1fa6dee9SAndroid Build Coastguard Worker }, 409*1fa6dee9SAndroid Build Coastguard Worker }, 410*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S *struct{ S1 []string } }{ 411*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S1 []string }{ 412*1fa6dee9SAndroid Build Coastguard Worker S1: []string{"string2"}, 413*1fa6dee9SAndroid Build Coastguard Worker }, 414*1fa6dee9SAndroid Build Coastguard Worker }, 415*1fa6dee9SAndroid Build Coastguard Worker order: Replace, 416*1fa6dee9SAndroid Build Coastguard Worker }, 417*1fa6dee9SAndroid Build Coastguard Worker { 418*1fa6dee9SAndroid Build Coastguard Worker name: "Append slice of structs", 419*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S []struct{ F string } }{ 420*1fa6dee9SAndroid Build Coastguard Worker S: []struct{ F string }{ 421*1fa6dee9SAndroid Build Coastguard Worker {F: "foo"}, {F: "bar"}, 422*1fa6dee9SAndroid Build Coastguard Worker }, 423*1fa6dee9SAndroid Build Coastguard Worker }, 424*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S []struct{ F string } }{ 425*1fa6dee9SAndroid Build Coastguard Worker S: []struct{ F string }{ 426*1fa6dee9SAndroid Build Coastguard Worker {F: "baz"}, 427*1fa6dee9SAndroid Build Coastguard Worker }, 428*1fa6dee9SAndroid Build Coastguard Worker }, 429*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S []struct{ F string } }{ 430*1fa6dee9SAndroid Build Coastguard Worker S: []struct{ F string }{ 431*1fa6dee9SAndroid Build Coastguard Worker {F: "foo"}, {F: "bar"}, {F: "baz"}, 432*1fa6dee9SAndroid Build Coastguard Worker }, 433*1fa6dee9SAndroid Build Coastguard Worker }, 434*1fa6dee9SAndroid Build Coastguard Worker order: Append, 435*1fa6dee9SAndroid Build Coastguard Worker }, 436*1fa6dee9SAndroid Build Coastguard Worker { 437*1fa6dee9SAndroid Build Coastguard Worker name: "Prepend slice of structs", 438*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S []struct{ F string } }{ 439*1fa6dee9SAndroid Build Coastguard Worker S: []struct{ F string }{ 440*1fa6dee9SAndroid Build Coastguard Worker {F: "foo"}, {F: "bar"}, 441*1fa6dee9SAndroid Build Coastguard Worker }, 442*1fa6dee9SAndroid Build Coastguard Worker }, 443*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S []struct{ F string } }{ 444*1fa6dee9SAndroid Build Coastguard Worker S: []struct{ F string }{ 445*1fa6dee9SAndroid Build Coastguard Worker {F: "baz"}, 446*1fa6dee9SAndroid Build Coastguard Worker }, 447*1fa6dee9SAndroid Build Coastguard Worker }, 448*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S []struct{ F string } }{ 449*1fa6dee9SAndroid Build Coastguard Worker S: []struct{ F string }{ 450*1fa6dee9SAndroid Build Coastguard Worker {F: "baz"}, {F: "foo"}, {F: "bar"}, 451*1fa6dee9SAndroid Build Coastguard Worker }, 452*1fa6dee9SAndroid Build Coastguard Worker }, 453*1fa6dee9SAndroid Build Coastguard Worker order: Prepend, 454*1fa6dee9SAndroid Build Coastguard Worker }, 455*1fa6dee9SAndroid Build Coastguard Worker { 456*1fa6dee9SAndroid Build Coastguard Worker name: "Append map", 457*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S map[string]string }{ 458*1fa6dee9SAndroid Build Coastguard Worker S: map[string]string{ 459*1fa6dee9SAndroid Build Coastguard Worker "key0": "", 460*1fa6dee9SAndroid Build Coastguard Worker "key1": "dst_value1", 461*1fa6dee9SAndroid Build Coastguard Worker "key2": "dst_value2", 462*1fa6dee9SAndroid Build Coastguard Worker }, 463*1fa6dee9SAndroid Build Coastguard Worker }, 464*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S map[string]string }{ 465*1fa6dee9SAndroid Build Coastguard Worker S: map[string]string{ 466*1fa6dee9SAndroid Build Coastguard Worker "key0": "src_value0", 467*1fa6dee9SAndroid Build Coastguard Worker "key1": "src_value1", 468*1fa6dee9SAndroid Build Coastguard Worker "key3": "src_value3", 469*1fa6dee9SAndroid Build Coastguard Worker }, 470*1fa6dee9SAndroid Build Coastguard Worker }, 471*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S map[string]string }{ 472*1fa6dee9SAndroid Build Coastguard Worker S: map[string]string{ 473*1fa6dee9SAndroid Build Coastguard Worker "key0": "src_value0", 474*1fa6dee9SAndroid Build Coastguard Worker "key1": "src_value1", 475*1fa6dee9SAndroid Build Coastguard Worker "key2": "dst_value2", 476*1fa6dee9SAndroid Build Coastguard Worker "key3": "src_value3", 477*1fa6dee9SAndroid Build Coastguard Worker }, 478*1fa6dee9SAndroid Build Coastguard Worker }, 479*1fa6dee9SAndroid Build Coastguard Worker order: Append, 480*1fa6dee9SAndroid Build Coastguard Worker }, 481*1fa6dee9SAndroid Build Coastguard Worker { 482*1fa6dee9SAndroid Build Coastguard Worker name: "Prepend map", 483*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S map[string]string }{ 484*1fa6dee9SAndroid Build Coastguard Worker S: map[string]string{ 485*1fa6dee9SAndroid Build Coastguard Worker "key0": "", 486*1fa6dee9SAndroid Build Coastguard Worker "key1": "dst_value1", 487*1fa6dee9SAndroid Build Coastguard Worker "key2": "dst_value2", 488*1fa6dee9SAndroid Build Coastguard Worker }, 489*1fa6dee9SAndroid Build Coastguard Worker }, 490*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S map[string]string }{ 491*1fa6dee9SAndroid Build Coastguard Worker S: map[string]string{ 492*1fa6dee9SAndroid Build Coastguard Worker "key0": "src_value0", 493*1fa6dee9SAndroid Build Coastguard Worker "key1": "src_value1", 494*1fa6dee9SAndroid Build Coastguard Worker "key3": "src_value3", 495*1fa6dee9SAndroid Build Coastguard Worker }, 496*1fa6dee9SAndroid Build Coastguard Worker }, 497*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S map[string]string }{ 498*1fa6dee9SAndroid Build Coastguard Worker S: map[string]string{ 499*1fa6dee9SAndroid Build Coastguard Worker "key0": "", 500*1fa6dee9SAndroid Build Coastguard Worker "key1": "dst_value1", 501*1fa6dee9SAndroid Build Coastguard Worker "key2": "dst_value2", 502*1fa6dee9SAndroid Build Coastguard Worker "key3": "src_value3", 503*1fa6dee9SAndroid Build Coastguard Worker }, 504*1fa6dee9SAndroid Build Coastguard Worker }, 505*1fa6dee9SAndroid Build Coastguard Worker order: Prepend, 506*1fa6dee9SAndroid Build Coastguard Worker }, 507*1fa6dee9SAndroid Build Coastguard Worker { 508*1fa6dee9SAndroid Build Coastguard Worker name: "Replace map", 509*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S map[string]string }{ 510*1fa6dee9SAndroid Build Coastguard Worker S: map[string]string{ 511*1fa6dee9SAndroid Build Coastguard Worker "key0": "", 512*1fa6dee9SAndroid Build Coastguard Worker "key1": "dst_value1", 513*1fa6dee9SAndroid Build Coastguard Worker "key2": "dst_value2", 514*1fa6dee9SAndroid Build Coastguard Worker }, 515*1fa6dee9SAndroid Build Coastguard Worker }, 516*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S map[string]string }{ 517*1fa6dee9SAndroid Build Coastguard Worker S: map[string]string{ 518*1fa6dee9SAndroid Build Coastguard Worker "key0": "src_value0", 519*1fa6dee9SAndroid Build Coastguard Worker "key1": "src_value1", 520*1fa6dee9SAndroid Build Coastguard Worker "key3": "src_value3", 521*1fa6dee9SAndroid Build Coastguard Worker }, 522*1fa6dee9SAndroid Build Coastguard Worker }, 523*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S map[string]string }{ 524*1fa6dee9SAndroid Build Coastguard Worker S: map[string]string{ 525*1fa6dee9SAndroid Build Coastguard Worker "key0": "src_value0", 526*1fa6dee9SAndroid Build Coastguard Worker "key1": "src_value1", 527*1fa6dee9SAndroid Build Coastguard Worker "key3": "src_value3", 528*1fa6dee9SAndroid Build Coastguard Worker }, 529*1fa6dee9SAndroid Build Coastguard Worker }, 530*1fa6dee9SAndroid Build Coastguard Worker order: Replace, 531*1fa6dee9SAndroid Build Coastguard Worker }, 532*1fa6dee9SAndroid Build Coastguard Worker { 533*1fa6dee9SAndroid Build Coastguard Worker name: "Append empty map", 534*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S1, S2 map[string]string }{ 535*1fa6dee9SAndroid Build Coastguard Worker S1: map[string]string{"key0": "dst_value0"}, 536*1fa6dee9SAndroid Build Coastguard Worker S2: map[string]string{}, 537*1fa6dee9SAndroid Build Coastguard Worker }, 538*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S1, S2 map[string]string }{ 539*1fa6dee9SAndroid Build Coastguard Worker S1: map[string]string{}, 540*1fa6dee9SAndroid Build Coastguard Worker S2: map[string]string{"key0": "src_value0"}, 541*1fa6dee9SAndroid Build Coastguard Worker }, 542*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S1, S2 map[string]string }{ 543*1fa6dee9SAndroid Build Coastguard Worker S1: map[string]string{"key0": "dst_value0"}, 544*1fa6dee9SAndroid Build Coastguard Worker S2: map[string]string{"key0": "src_value0"}, 545*1fa6dee9SAndroid Build Coastguard Worker }, 546*1fa6dee9SAndroid Build Coastguard Worker order: Append, 547*1fa6dee9SAndroid Build Coastguard Worker }, 548*1fa6dee9SAndroid Build Coastguard Worker { 549*1fa6dee9SAndroid Build Coastguard Worker name: "Prepend empty map", 550*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S1, S2 map[string]string }{ 551*1fa6dee9SAndroid Build Coastguard Worker S1: map[string]string{"key0": "dst_value0"}, 552*1fa6dee9SAndroid Build Coastguard Worker S2: map[string]string{}, 553*1fa6dee9SAndroid Build Coastguard Worker }, 554*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S1, S2 map[string]string }{ 555*1fa6dee9SAndroid Build Coastguard Worker S1: map[string]string{}, 556*1fa6dee9SAndroid Build Coastguard Worker S2: map[string]string{"key0": "src_value0"}, 557*1fa6dee9SAndroid Build Coastguard Worker }, 558*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S1, S2 map[string]string }{ 559*1fa6dee9SAndroid Build Coastguard Worker S1: map[string]string{"key0": "dst_value0"}, 560*1fa6dee9SAndroid Build Coastguard Worker S2: map[string]string{"key0": "src_value0"}, 561*1fa6dee9SAndroid Build Coastguard Worker }, 562*1fa6dee9SAndroid Build Coastguard Worker order: Prepend, 563*1fa6dee9SAndroid Build Coastguard Worker }, 564*1fa6dee9SAndroid Build Coastguard Worker { 565*1fa6dee9SAndroid Build Coastguard Worker name: "Replace empty map", 566*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S1, S2 map[string]string }{ 567*1fa6dee9SAndroid Build Coastguard Worker S1: map[string]string{"key0": "dst_value0"}, 568*1fa6dee9SAndroid Build Coastguard Worker S2: map[string]string{}, 569*1fa6dee9SAndroid Build Coastguard Worker }, 570*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S1, S2 map[string]string }{ 571*1fa6dee9SAndroid Build Coastguard Worker S1: map[string]string{}, 572*1fa6dee9SAndroid Build Coastguard Worker S2: map[string]string{"key0": "src_value0"}, 573*1fa6dee9SAndroid Build Coastguard Worker }, 574*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S1, S2 map[string]string }{ 575*1fa6dee9SAndroid Build Coastguard Worker S1: map[string]string{}, 576*1fa6dee9SAndroid Build Coastguard Worker S2: map[string]string{"key0": "src_value0"}, 577*1fa6dee9SAndroid Build Coastguard Worker }, 578*1fa6dee9SAndroid Build Coastguard Worker order: Replace, 579*1fa6dee9SAndroid Build Coastguard Worker }, 580*1fa6dee9SAndroid Build Coastguard Worker { 581*1fa6dee9SAndroid Build Coastguard Worker name: "Append nil map", 582*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S1, S2, S3 map[string]string }{ 583*1fa6dee9SAndroid Build Coastguard Worker S1: map[string]string{"key0": "dst_value0"}, 584*1fa6dee9SAndroid Build Coastguard Worker }, 585*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S1, S2, S3 map[string]string }{ 586*1fa6dee9SAndroid Build Coastguard Worker S2: map[string]string{"key0": "src_value0"}, 587*1fa6dee9SAndroid Build Coastguard Worker }, 588*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S1, S2, S3 map[string]string }{ 589*1fa6dee9SAndroid Build Coastguard Worker S1: map[string]string{"key0": "dst_value0"}, 590*1fa6dee9SAndroid Build Coastguard Worker S2: map[string]string{"key0": "src_value0"}, 591*1fa6dee9SAndroid Build Coastguard Worker }, 592*1fa6dee9SAndroid Build Coastguard Worker order: Append, 593*1fa6dee9SAndroid Build Coastguard Worker }, 594*1fa6dee9SAndroid Build Coastguard Worker { 595*1fa6dee9SAndroid Build Coastguard Worker name: "Prepend nil map", 596*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S1, S2, S3 map[string]string }{ 597*1fa6dee9SAndroid Build Coastguard Worker S1: map[string]string{"key0": "dst_value0"}, 598*1fa6dee9SAndroid Build Coastguard Worker }, 599*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S1, S2, S3 map[string]string }{ 600*1fa6dee9SAndroid Build Coastguard Worker S2: map[string]string{"key0": "src_value0"}, 601*1fa6dee9SAndroid Build Coastguard Worker }, 602*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S1, S2, S3 map[string]string }{ 603*1fa6dee9SAndroid Build Coastguard Worker S1: map[string]string{"key0": "dst_value0"}, 604*1fa6dee9SAndroid Build Coastguard Worker S2: map[string]string{"key0": "src_value0"}, 605*1fa6dee9SAndroid Build Coastguard Worker }, 606*1fa6dee9SAndroid Build Coastguard Worker order: Prepend, 607*1fa6dee9SAndroid Build Coastguard Worker }, 608*1fa6dee9SAndroid Build Coastguard Worker { 609*1fa6dee9SAndroid Build Coastguard Worker name: "Replace nil map", 610*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S1, S2, S3 map[string]string }{ 611*1fa6dee9SAndroid Build Coastguard Worker S1: map[string]string{"key0": "dst_value0"}, 612*1fa6dee9SAndroid Build Coastguard Worker }, 613*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S1, S2, S3 map[string]string }{ 614*1fa6dee9SAndroid Build Coastguard Worker S2: map[string]string{"key0": "src_value0"}, 615*1fa6dee9SAndroid Build Coastguard Worker }, 616*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S1, S2, S3 map[string]string }{ 617*1fa6dee9SAndroid Build Coastguard Worker S1: map[string]string{"key0": "dst_value0"}, 618*1fa6dee9SAndroid Build Coastguard Worker S2: map[string]string{"key0": "src_value0"}, 619*1fa6dee9SAndroid Build Coastguard Worker S3: nil, 620*1fa6dee9SAndroid Build Coastguard Worker }, 621*1fa6dee9SAndroid Build Coastguard Worker order: Replace, 622*1fa6dee9SAndroid Build Coastguard Worker }, 623*1fa6dee9SAndroid Build Coastguard Worker { 624*1fa6dee9SAndroid Build Coastguard Worker name: "Replace slice of structs", 625*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S []struct{ F string } }{ 626*1fa6dee9SAndroid Build Coastguard Worker S: []struct{ F string }{ 627*1fa6dee9SAndroid Build Coastguard Worker {F: "foo"}, {F: "bar"}, 628*1fa6dee9SAndroid Build Coastguard Worker }, 629*1fa6dee9SAndroid Build Coastguard Worker }, 630*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S []struct{ F string } }{ 631*1fa6dee9SAndroid Build Coastguard Worker S: []struct{ F string }{ 632*1fa6dee9SAndroid Build Coastguard Worker {F: "baz"}, 633*1fa6dee9SAndroid Build Coastguard Worker }, 634*1fa6dee9SAndroid Build Coastguard Worker }, 635*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S []struct{ F string } }{ 636*1fa6dee9SAndroid Build Coastguard Worker S: []struct{ F string }{ 637*1fa6dee9SAndroid Build Coastguard Worker {F: "baz"}, 638*1fa6dee9SAndroid Build Coastguard Worker }, 639*1fa6dee9SAndroid Build Coastguard Worker }, 640*1fa6dee9SAndroid Build Coastguard Worker order: Replace, 641*1fa6dee9SAndroid Build Coastguard Worker }, 642*1fa6dee9SAndroid Build Coastguard Worker { 643*1fa6dee9SAndroid Build Coastguard Worker name: "Append pointer", 644*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S *struct{ S string } }{ 645*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S string }{ 646*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 647*1fa6dee9SAndroid Build Coastguard Worker }, 648*1fa6dee9SAndroid Build Coastguard Worker }, 649*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S *struct{ S string } }{ 650*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S string }{ 651*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 652*1fa6dee9SAndroid Build Coastguard Worker }, 653*1fa6dee9SAndroid Build Coastguard Worker }, 654*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S *struct{ S string } }{ 655*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S string }{ 656*1fa6dee9SAndroid Build Coastguard Worker S: "string1string2", 657*1fa6dee9SAndroid Build Coastguard Worker }, 658*1fa6dee9SAndroid Build Coastguard Worker }, 659*1fa6dee9SAndroid Build Coastguard Worker }, 660*1fa6dee9SAndroid Build Coastguard Worker { 661*1fa6dee9SAndroid Build Coastguard Worker name: "Prepend pointer", 662*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S *struct{ S string } }{ 663*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S string }{ 664*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 665*1fa6dee9SAndroid Build Coastguard Worker }, 666*1fa6dee9SAndroid Build Coastguard Worker }, 667*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S *struct{ S string } }{ 668*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S string }{ 669*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 670*1fa6dee9SAndroid Build Coastguard Worker }, 671*1fa6dee9SAndroid Build Coastguard Worker }, 672*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S *struct{ S string } }{ 673*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S string }{ 674*1fa6dee9SAndroid Build Coastguard Worker S: "string2string1", 675*1fa6dee9SAndroid Build Coastguard Worker }, 676*1fa6dee9SAndroid Build Coastguard Worker }, 677*1fa6dee9SAndroid Build Coastguard Worker order: Prepend, 678*1fa6dee9SAndroid Build Coastguard Worker }, 679*1fa6dee9SAndroid Build Coastguard Worker { 680*1fa6dee9SAndroid Build Coastguard Worker name: "Append interface", 681*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S interface{} }{ 682*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S string }{ 683*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 684*1fa6dee9SAndroid Build Coastguard Worker }, 685*1fa6dee9SAndroid Build Coastguard Worker }, 686*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S interface{} }{ 687*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S string }{ 688*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 689*1fa6dee9SAndroid Build Coastguard Worker }, 690*1fa6dee9SAndroid Build Coastguard Worker }, 691*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S interface{} }{ 692*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S string }{ 693*1fa6dee9SAndroid Build Coastguard Worker S: "string1string2", 694*1fa6dee9SAndroid Build Coastguard Worker }, 695*1fa6dee9SAndroid Build Coastguard Worker }, 696*1fa6dee9SAndroid Build Coastguard Worker }, 697*1fa6dee9SAndroid Build Coastguard Worker { 698*1fa6dee9SAndroid Build Coastguard Worker name: "Prepend interface", 699*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S interface{} }{ 700*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S string }{ 701*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 702*1fa6dee9SAndroid Build Coastguard Worker }, 703*1fa6dee9SAndroid Build Coastguard Worker }, 704*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S interface{} }{ 705*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S string }{ 706*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 707*1fa6dee9SAndroid Build Coastguard Worker }, 708*1fa6dee9SAndroid Build Coastguard Worker }, 709*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S interface{} }{ 710*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S string }{ 711*1fa6dee9SAndroid Build Coastguard Worker S: "string2string1", 712*1fa6dee9SAndroid Build Coastguard Worker }, 713*1fa6dee9SAndroid Build Coastguard Worker }, 714*1fa6dee9SAndroid Build Coastguard Worker order: Prepend, 715*1fa6dee9SAndroid Build Coastguard Worker }, 716*1fa6dee9SAndroid Build Coastguard Worker { 717*1fa6dee9SAndroid Build Coastguard Worker name: "Unexported field", 718*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ s string }{ 719*1fa6dee9SAndroid Build Coastguard Worker s: "string1", 720*1fa6dee9SAndroid Build Coastguard Worker }, 721*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ s string }{ 722*1fa6dee9SAndroid Build Coastguard Worker s: "string2", 723*1fa6dee9SAndroid Build Coastguard Worker }, 724*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ s string }{ 725*1fa6dee9SAndroid Build Coastguard Worker s: "string1", 726*1fa6dee9SAndroid Build Coastguard Worker }, 727*1fa6dee9SAndroid Build Coastguard Worker }, 728*1fa6dee9SAndroid Build Coastguard Worker { 729*1fa6dee9SAndroid Build Coastguard Worker name: "Unexported field", 730*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ i *int64 }{ 731*1fa6dee9SAndroid Build Coastguard Worker i: Int64Ptr(33), 732*1fa6dee9SAndroid Build Coastguard Worker }, 733*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ i *int64 }{ 734*1fa6dee9SAndroid Build Coastguard Worker i: Int64Ptr(5), 735*1fa6dee9SAndroid Build Coastguard Worker }, 736*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ i *int64 }{ 737*1fa6dee9SAndroid Build Coastguard Worker i: Int64Ptr(33), 738*1fa6dee9SAndroid Build Coastguard Worker }, 739*1fa6dee9SAndroid Build Coastguard Worker }, 740*1fa6dee9SAndroid Build Coastguard Worker { 741*1fa6dee9SAndroid Build Coastguard Worker name: "Empty struct", 742*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{}{}, 743*1fa6dee9SAndroid Build Coastguard Worker src: &struct{}{}, 744*1fa6dee9SAndroid Build Coastguard Worker out: &struct{}{}, 745*1fa6dee9SAndroid Build Coastguard Worker }, 746*1fa6dee9SAndroid Build Coastguard Worker { 747*1fa6dee9SAndroid Build Coastguard Worker name: "Interface nil", 748*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S interface{} }{ 749*1fa6dee9SAndroid Build Coastguard Worker S: nil, 750*1fa6dee9SAndroid Build Coastguard Worker }, 751*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S interface{} }{ 752*1fa6dee9SAndroid Build Coastguard Worker S: nil, 753*1fa6dee9SAndroid Build Coastguard Worker }, 754*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S interface{} }{ 755*1fa6dee9SAndroid Build Coastguard Worker S: nil, 756*1fa6dee9SAndroid Build Coastguard Worker }, 757*1fa6dee9SAndroid Build Coastguard Worker }, 758*1fa6dee9SAndroid Build Coastguard Worker { 759*1fa6dee9SAndroid Build Coastguard Worker name: "Pointer nil", 760*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S *struct{} }{ 761*1fa6dee9SAndroid Build Coastguard Worker S: nil, 762*1fa6dee9SAndroid Build Coastguard Worker }, 763*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S *struct{} }{ 764*1fa6dee9SAndroid Build Coastguard Worker S: nil, 765*1fa6dee9SAndroid Build Coastguard Worker }, 766*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S *struct{} }{ 767*1fa6dee9SAndroid Build Coastguard Worker S: nil, 768*1fa6dee9SAndroid Build Coastguard Worker }, 769*1fa6dee9SAndroid Build Coastguard Worker }, 770*1fa6dee9SAndroid Build Coastguard Worker { 771*1fa6dee9SAndroid Build Coastguard Worker name: "Anonymous struct", 772*1fa6dee9SAndroid Build Coastguard Worker dst: &struct { 773*1fa6dee9SAndroid Build Coastguard Worker EmbeddedStruct 774*1fa6dee9SAndroid Build Coastguard Worker Nested struct{ EmbeddedStruct } 775*1fa6dee9SAndroid Build Coastguard Worker }{ 776*1fa6dee9SAndroid Build Coastguard Worker EmbeddedStruct: EmbeddedStruct{ 777*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 778*1fa6dee9SAndroid Build Coastguard Worker I: Int64Ptr(55), 779*1fa6dee9SAndroid Build Coastguard Worker }, 780*1fa6dee9SAndroid Build Coastguard Worker Nested: struct{ EmbeddedStruct }{ 781*1fa6dee9SAndroid Build Coastguard Worker EmbeddedStruct: EmbeddedStruct{ 782*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 783*1fa6dee9SAndroid Build Coastguard Worker I: Int64Ptr(-4), 784*1fa6dee9SAndroid Build Coastguard Worker }, 785*1fa6dee9SAndroid Build Coastguard Worker }, 786*1fa6dee9SAndroid Build Coastguard Worker }, 787*1fa6dee9SAndroid Build Coastguard Worker src: &struct { 788*1fa6dee9SAndroid Build Coastguard Worker EmbeddedStruct 789*1fa6dee9SAndroid Build Coastguard Worker Nested struct{ EmbeddedStruct } 790*1fa6dee9SAndroid Build Coastguard Worker }{ 791*1fa6dee9SAndroid Build Coastguard Worker EmbeddedStruct: EmbeddedStruct{ 792*1fa6dee9SAndroid Build Coastguard Worker S: "string3", 793*1fa6dee9SAndroid Build Coastguard Worker I: Int64Ptr(66), 794*1fa6dee9SAndroid Build Coastguard Worker }, 795*1fa6dee9SAndroid Build Coastguard Worker Nested: struct{ EmbeddedStruct }{ 796*1fa6dee9SAndroid Build Coastguard Worker EmbeddedStruct: EmbeddedStruct{ 797*1fa6dee9SAndroid Build Coastguard Worker S: "string4", 798*1fa6dee9SAndroid Build Coastguard Worker I: Int64Ptr(-8), 799*1fa6dee9SAndroid Build Coastguard Worker }, 800*1fa6dee9SAndroid Build Coastguard Worker }, 801*1fa6dee9SAndroid Build Coastguard Worker }, 802*1fa6dee9SAndroid Build Coastguard Worker out: &struct { 803*1fa6dee9SAndroid Build Coastguard Worker EmbeddedStruct 804*1fa6dee9SAndroid Build Coastguard Worker Nested struct{ EmbeddedStruct } 805*1fa6dee9SAndroid Build Coastguard Worker }{ 806*1fa6dee9SAndroid Build Coastguard Worker EmbeddedStruct: EmbeddedStruct{ 807*1fa6dee9SAndroid Build Coastguard Worker S: "string1string3", 808*1fa6dee9SAndroid Build Coastguard Worker I: Int64Ptr(66), 809*1fa6dee9SAndroid Build Coastguard Worker }, 810*1fa6dee9SAndroid Build Coastguard Worker Nested: struct{ EmbeddedStruct }{ 811*1fa6dee9SAndroid Build Coastguard Worker EmbeddedStruct: EmbeddedStruct{ 812*1fa6dee9SAndroid Build Coastguard Worker S: "string2string4", 813*1fa6dee9SAndroid Build Coastguard Worker I: Int64Ptr(-8), 814*1fa6dee9SAndroid Build Coastguard Worker }, 815*1fa6dee9SAndroid Build Coastguard Worker }, 816*1fa6dee9SAndroid Build Coastguard Worker }, 817*1fa6dee9SAndroid Build Coastguard Worker }, 818*1fa6dee9SAndroid Build Coastguard Worker { 819*1fa6dee9SAndroid Build Coastguard Worker name: "BlueprintEmbed struct", 820*1fa6dee9SAndroid Build Coastguard Worker dst: &struct { 821*1fa6dee9SAndroid Build Coastguard Worker BlueprintEmbed EmbeddedStruct 822*1fa6dee9SAndroid Build Coastguard Worker Nested struct{ BlueprintEmbed EmbeddedStruct } 823*1fa6dee9SAndroid Build Coastguard Worker }{ 824*1fa6dee9SAndroid Build Coastguard Worker BlueprintEmbed: EmbeddedStruct{ 825*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 826*1fa6dee9SAndroid Build Coastguard Worker I: Int64Ptr(55), 827*1fa6dee9SAndroid Build Coastguard Worker }, 828*1fa6dee9SAndroid Build Coastguard Worker Nested: struct{ BlueprintEmbed EmbeddedStruct }{ 829*1fa6dee9SAndroid Build Coastguard Worker BlueprintEmbed: EmbeddedStruct{ 830*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 831*1fa6dee9SAndroid Build Coastguard Worker I: Int64Ptr(-4), 832*1fa6dee9SAndroid Build Coastguard Worker }, 833*1fa6dee9SAndroid Build Coastguard Worker }, 834*1fa6dee9SAndroid Build Coastguard Worker }, 835*1fa6dee9SAndroid Build Coastguard Worker src: &struct { 836*1fa6dee9SAndroid Build Coastguard Worker BlueprintEmbed EmbeddedStruct 837*1fa6dee9SAndroid Build Coastguard Worker Nested struct{ BlueprintEmbed EmbeddedStruct } 838*1fa6dee9SAndroid Build Coastguard Worker }{ 839*1fa6dee9SAndroid Build Coastguard Worker BlueprintEmbed: EmbeddedStruct{ 840*1fa6dee9SAndroid Build Coastguard Worker S: "string3", 841*1fa6dee9SAndroid Build Coastguard Worker I: Int64Ptr(66), 842*1fa6dee9SAndroid Build Coastguard Worker }, 843*1fa6dee9SAndroid Build Coastguard Worker Nested: struct{ BlueprintEmbed EmbeddedStruct }{ 844*1fa6dee9SAndroid Build Coastguard Worker BlueprintEmbed: EmbeddedStruct{ 845*1fa6dee9SAndroid Build Coastguard Worker S: "string4", 846*1fa6dee9SAndroid Build Coastguard Worker I: Int64Ptr(-8), 847*1fa6dee9SAndroid Build Coastguard Worker }, 848*1fa6dee9SAndroid Build Coastguard Worker }, 849*1fa6dee9SAndroid Build Coastguard Worker }, 850*1fa6dee9SAndroid Build Coastguard Worker out: &struct { 851*1fa6dee9SAndroid Build Coastguard Worker BlueprintEmbed EmbeddedStruct 852*1fa6dee9SAndroid Build Coastguard Worker Nested struct{ BlueprintEmbed EmbeddedStruct } 853*1fa6dee9SAndroid Build Coastguard Worker }{ 854*1fa6dee9SAndroid Build Coastguard Worker BlueprintEmbed: EmbeddedStruct{ 855*1fa6dee9SAndroid Build Coastguard Worker S: "string1string3", 856*1fa6dee9SAndroid Build Coastguard Worker I: Int64Ptr(66), 857*1fa6dee9SAndroid Build Coastguard Worker }, 858*1fa6dee9SAndroid Build Coastguard Worker Nested: struct{ BlueprintEmbed EmbeddedStruct }{ 859*1fa6dee9SAndroid Build Coastguard Worker BlueprintEmbed: EmbeddedStruct{ 860*1fa6dee9SAndroid Build Coastguard Worker S: "string2string4", 861*1fa6dee9SAndroid Build Coastguard Worker I: Int64Ptr(-8), 862*1fa6dee9SAndroid Build Coastguard Worker }, 863*1fa6dee9SAndroid Build Coastguard Worker }, 864*1fa6dee9SAndroid Build Coastguard Worker }, 865*1fa6dee9SAndroid Build Coastguard Worker }, 866*1fa6dee9SAndroid Build Coastguard Worker { 867*1fa6dee9SAndroid Build Coastguard Worker name: "Anonymous interface", 868*1fa6dee9SAndroid Build Coastguard Worker dst: &struct { 869*1fa6dee9SAndroid Build Coastguard Worker EmbeddedInterface 870*1fa6dee9SAndroid Build Coastguard Worker Nested struct{ EmbeddedInterface } 871*1fa6dee9SAndroid Build Coastguard Worker }{ 872*1fa6dee9SAndroid Build Coastguard Worker EmbeddedInterface: &struct { 873*1fa6dee9SAndroid Build Coastguard Worker S string 874*1fa6dee9SAndroid Build Coastguard Worker I *int64 875*1fa6dee9SAndroid Build Coastguard Worker }{ 876*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 877*1fa6dee9SAndroid Build Coastguard Worker I: Int64Ptr(-8), 878*1fa6dee9SAndroid Build Coastguard Worker }, 879*1fa6dee9SAndroid Build Coastguard Worker Nested: struct{ EmbeddedInterface }{ 880*1fa6dee9SAndroid Build Coastguard Worker EmbeddedInterface: &struct { 881*1fa6dee9SAndroid Build Coastguard Worker S string 882*1fa6dee9SAndroid Build Coastguard Worker I *int64 883*1fa6dee9SAndroid Build Coastguard Worker }{ 884*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 885*1fa6dee9SAndroid Build Coastguard Worker I: Int64Ptr(55), 886*1fa6dee9SAndroid Build Coastguard Worker }, 887*1fa6dee9SAndroid Build Coastguard Worker }, 888*1fa6dee9SAndroid Build Coastguard Worker }, 889*1fa6dee9SAndroid Build Coastguard Worker src: &struct { 890*1fa6dee9SAndroid Build Coastguard Worker EmbeddedInterface 891*1fa6dee9SAndroid Build Coastguard Worker Nested struct{ EmbeddedInterface } 892*1fa6dee9SAndroid Build Coastguard Worker }{ 893*1fa6dee9SAndroid Build Coastguard Worker EmbeddedInterface: &struct { 894*1fa6dee9SAndroid Build Coastguard Worker S string 895*1fa6dee9SAndroid Build Coastguard Worker I *int64 896*1fa6dee9SAndroid Build Coastguard Worker }{ 897*1fa6dee9SAndroid Build Coastguard Worker S: "string3", 898*1fa6dee9SAndroid Build Coastguard Worker I: Int64Ptr(6), 899*1fa6dee9SAndroid Build Coastguard Worker }, 900*1fa6dee9SAndroid Build Coastguard Worker Nested: struct{ EmbeddedInterface }{ 901*1fa6dee9SAndroid Build Coastguard Worker EmbeddedInterface: &struct { 902*1fa6dee9SAndroid Build Coastguard Worker S string 903*1fa6dee9SAndroid Build Coastguard Worker I *int64 904*1fa6dee9SAndroid Build Coastguard Worker }{ 905*1fa6dee9SAndroid Build Coastguard Worker S: "string4", 906*1fa6dee9SAndroid Build Coastguard Worker I: Int64Ptr(6), 907*1fa6dee9SAndroid Build Coastguard Worker }, 908*1fa6dee9SAndroid Build Coastguard Worker }, 909*1fa6dee9SAndroid Build Coastguard Worker }, 910*1fa6dee9SAndroid Build Coastguard Worker out: &struct { 911*1fa6dee9SAndroid Build Coastguard Worker EmbeddedInterface 912*1fa6dee9SAndroid Build Coastguard Worker Nested struct{ EmbeddedInterface } 913*1fa6dee9SAndroid Build Coastguard Worker }{ 914*1fa6dee9SAndroid Build Coastguard Worker EmbeddedInterface: &struct { 915*1fa6dee9SAndroid Build Coastguard Worker S string 916*1fa6dee9SAndroid Build Coastguard Worker I *int64 917*1fa6dee9SAndroid Build Coastguard Worker }{ 918*1fa6dee9SAndroid Build Coastguard Worker S: "string1string3", 919*1fa6dee9SAndroid Build Coastguard Worker I: Int64Ptr(6), 920*1fa6dee9SAndroid Build Coastguard Worker }, 921*1fa6dee9SAndroid Build Coastguard Worker Nested: struct{ EmbeddedInterface }{ 922*1fa6dee9SAndroid Build Coastguard Worker EmbeddedInterface: &struct { 923*1fa6dee9SAndroid Build Coastguard Worker S string 924*1fa6dee9SAndroid Build Coastguard Worker I *int64 925*1fa6dee9SAndroid Build Coastguard Worker }{ 926*1fa6dee9SAndroid Build Coastguard Worker S: "string2string4", 927*1fa6dee9SAndroid Build Coastguard Worker I: Int64Ptr(6), 928*1fa6dee9SAndroid Build Coastguard Worker }, 929*1fa6dee9SAndroid Build Coastguard Worker }, 930*1fa6dee9SAndroid Build Coastguard Worker }, 931*1fa6dee9SAndroid Build Coastguard Worker }, 932*1fa6dee9SAndroid Build Coastguard Worker { 933*1fa6dee9SAndroid Build Coastguard Worker name: "Nil pointer to a struct", 934*1fa6dee9SAndroid Build Coastguard Worker dst: &struct { 935*1fa6dee9SAndroid Build Coastguard Worker Nested *struct { 936*1fa6dee9SAndroid Build Coastguard Worker S string 937*1fa6dee9SAndroid Build Coastguard Worker } 938*1fa6dee9SAndroid Build Coastguard Worker }{}, 939*1fa6dee9SAndroid Build Coastguard Worker src: &struct { 940*1fa6dee9SAndroid Build Coastguard Worker Nested *struct { 941*1fa6dee9SAndroid Build Coastguard Worker S string 942*1fa6dee9SAndroid Build Coastguard Worker } 943*1fa6dee9SAndroid Build Coastguard Worker }{ 944*1fa6dee9SAndroid Build Coastguard Worker Nested: &struct { 945*1fa6dee9SAndroid Build Coastguard Worker S string 946*1fa6dee9SAndroid Build Coastguard Worker }{ 947*1fa6dee9SAndroid Build Coastguard Worker S: "string", 948*1fa6dee9SAndroid Build Coastguard Worker }, 949*1fa6dee9SAndroid Build Coastguard Worker }, 950*1fa6dee9SAndroid Build Coastguard Worker out: &struct { 951*1fa6dee9SAndroid Build Coastguard Worker Nested *struct { 952*1fa6dee9SAndroid Build Coastguard Worker S string 953*1fa6dee9SAndroid Build Coastguard Worker } 954*1fa6dee9SAndroid Build Coastguard Worker }{ 955*1fa6dee9SAndroid Build Coastguard Worker Nested: &struct { 956*1fa6dee9SAndroid Build Coastguard Worker S string 957*1fa6dee9SAndroid Build Coastguard Worker }{ 958*1fa6dee9SAndroid Build Coastguard Worker S: "string", 959*1fa6dee9SAndroid Build Coastguard Worker }, 960*1fa6dee9SAndroid Build Coastguard Worker }, 961*1fa6dee9SAndroid Build Coastguard Worker }, 962*1fa6dee9SAndroid Build Coastguard Worker { 963*1fa6dee9SAndroid Build Coastguard Worker name: "Nil pointer to a struct in an interface", 964*1fa6dee9SAndroid Build Coastguard Worker dst: &struct { 965*1fa6dee9SAndroid Build Coastguard Worker Nested interface{} 966*1fa6dee9SAndroid Build Coastguard Worker }{ 967*1fa6dee9SAndroid Build Coastguard Worker Nested: (*struct{ S string })(nil), 968*1fa6dee9SAndroid Build Coastguard Worker }, 969*1fa6dee9SAndroid Build Coastguard Worker src: &struct { 970*1fa6dee9SAndroid Build Coastguard Worker Nested interface{} 971*1fa6dee9SAndroid Build Coastguard Worker }{ 972*1fa6dee9SAndroid Build Coastguard Worker Nested: &struct { 973*1fa6dee9SAndroid Build Coastguard Worker S string 974*1fa6dee9SAndroid Build Coastguard Worker }{ 975*1fa6dee9SAndroid Build Coastguard Worker S: "string", 976*1fa6dee9SAndroid Build Coastguard Worker }, 977*1fa6dee9SAndroid Build Coastguard Worker }, 978*1fa6dee9SAndroid Build Coastguard Worker out: &struct { 979*1fa6dee9SAndroid Build Coastguard Worker Nested interface{} 980*1fa6dee9SAndroid Build Coastguard Worker }{ 981*1fa6dee9SAndroid Build Coastguard Worker Nested: &struct { 982*1fa6dee9SAndroid Build Coastguard Worker S string 983*1fa6dee9SAndroid Build Coastguard Worker }{ 984*1fa6dee9SAndroid Build Coastguard Worker S: "string", 985*1fa6dee9SAndroid Build Coastguard Worker }, 986*1fa6dee9SAndroid Build Coastguard Worker }, 987*1fa6dee9SAndroid Build Coastguard Worker }, 988*1fa6dee9SAndroid Build Coastguard Worker { 989*1fa6dee9SAndroid Build Coastguard Worker name: "Interface src nil", 990*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S interface{} }{ 991*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S string }{ 992*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 993*1fa6dee9SAndroid Build Coastguard Worker }, 994*1fa6dee9SAndroid Build Coastguard Worker }, 995*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S interface{} }{ 996*1fa6dee9SAndroid Build Coastguard Worker S: nil, 997*1fa6dee9SAndroid Build Coastguard Worker }, 998*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S interface{} }{ 999*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S string }{ 1000*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1001*1fa6dee9SAndroid Build Coastguard Worker }, 1002*1fa6dee9SAndroid Build Coastguard Worker }, 1003*1fa6dee9SAndroid Build Coastguard Worker }, 1004*1fa6dee9SAndroid Build Coastguard Worker 1005*1fa6dee9SAndroid Build Coastguard Worker // Errors 1006*1fa6dee9SAndroid Build Coastguard Worker 1007*1fa6dee9SAndroid Build Coastguard Worker { 1008*1fa6dee9SAndroid Build Coastguard Worker name: "Non-pointer dst", 1009*1fa6dee9SAndroid Build Coastguard Worker dst: struct{}{}, 1010*1fa6dee9SAndroid Build Coastguard Worker src: &struct{}{}, 1011*1fa6dee9SAndroid Build Coastguard Worker err: errors.New("expected pointer to struct, got struct {}"), 1012*1fa6dee9SAndroid Build Coastguard Worker out: struct{}{}, 1013*1fa6dee9SAndroid Build Coastguard Worker }, 1014*1fa6dee9SAndroid Build Coastguard Worker { 1015*1fa6dee9SAndroid Build Coastguard Worker name: "Non-pointer src", 1016*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{}{}, 1017*1fa6dee9SAndroid Build Coastguard Worker src: struct{}{}, 1018*1fa6dee9SAndroid Build Coastguard Worker err: errors.New("expected pointer to struct, got struct {}"), 1019*1fa6dee9SAndroid Build Coastguard Worker out: &struct{}{}, 1020*1fa6dee9SAndroid Build Coastguard Worker }, 1021*1fa6dee9SAndroid Build Coastguard Worker { 1022*1fa6dee9SAndroid Build Coastguard Worker name: "Non-struct dst", 1023*1fa6dee9SAndroid Build Coastguard Worker dst: &[]string{"bad"}, 1024*1fa6dee9SAndroid Build Coastguard Worker src: &struct{}{}, 1025*1fa6dee9SAndroid Build Coastguard Worker err: errors.New("expected pointer to struct, got *[]string"), 1026*1fa6dee9SAndroid Build Coastguard Worker out: &[]string{"bad"}, 1027*1fa6dee9SAndroid Build Coastguard Worker }, 1028*1fa6dee9SAndroid Build Coastguard Worker { 1029*1fa6dee9SAndroid Build Coastguard Worker name: "Non-struct src", 1030*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{}{}, 1031*1fa6dee9SAndroid Build Coastguard Worker src: &[]string{"bad"}, 1032*1fa6dee9SAndroid Build Coastguard Worker err: errors.New("expected pointer to struct, got *[]string"), 1033*1fa6dee9SAndroid Build Coastguard Worker out: &struct{}{}, 1034*1fa6dee9SAndroid Build Coastguard Worker }, 1035*1fa6dee9SAndroid Build Coastguard Worker { 1036*1fa6dee9SAndroid Build Coastguard Worker name: "Mismatched types", 1037*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ A string }{ 1038*1fa6dee9SAndroid Build Coastguard Worker A: "string1", 1039*1fa6dee9SAndroid Build Coastguard Worker }, 1040*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ B string }{ 1041*1fa6dee9SAndroid Build Coastguard Worker B: "string2", 1042*1fa6dee9SAndroid Build Coastguard Worker }, 1043*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ A string }{ 1044*1fa6dee9SAndroid Build Coastguard Worker A: "string1", 1045*1fa6dee9SAndroid Build Coastguard Worker }, 1046*1fa6dee9SAndroid Build Coastguard Worker err: errors.New("expected matching types for dst and src, got *struct { A string } and *struct { B string }"), 1047*1fa6dee9SAndroid Build Coastguard Worker }, 1048*1fa6dee9SAndroid Build Coastguard Worker { 1049*1fa6dee9SAndroid Build Coastguard Worker name: "Unsupported kind", 1050*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ I int }{ 1051*1fa6dee9SAndroid Build Coastguard Worker I: 1, 1052*1fa6dee9SAndroid Build Coastguard Worker }, 1053*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ I int }{ 1054*1fa6dee9SAndroid Build Coastguard Worker I: 2, 1055*1fa6dee9SAndroid Build Coastguard Worker }, 1056*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ I int }{ 1057*1fa6dee9SAndroid Build Coastguard Worker I: 1, 1058*1fa6dee9SAndroid Build Coastguard Worker }, 1059*1fa6dee9SAndroid Build Coastguard Worker err: extendPropertyErrorf("i", "unsupported kind int"), 1060*1fa6dee9SAndroid Build Coastguard Worker }, 1061*1fa6dee9SAndroid Build Coastguard Worker { 1062*1fa6dee9SAndroid Build Coastguard Worker name: "Unsupported kind", 1063*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ I int64 }{ 1064*1fa6dee9SAndroid Build Coastguard Worker I: 1, 1065*1fa6dee9SAndroid Build Coastguard Worker }, 1066*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ I int64 }{ 1067*1fa6dee9SAndroid Build Coastguard Worker I: 2, 1068*1fa6dee9SAndroid Build Coastguard Worker }, 1069*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ I int64 }{ 1070*1fa6dee9SAndroid Build Coastguard Worker I: 1, 1071*1fa6dee9SAndroid Build Coastguard Worker }, 1072*1fa6dee9SAndroid Build Coastguard Worker err: extendPropertyErrorf("i", "unsupported kind int64"), 1073*1fa6dee9SAndroid Build Coastguard Worker }, 1074*1fa6dee9SAndroid Build Coastguard Worker { 1075*1fa6dee9SAndroid Build Coastguard Worker name: "Interface nilitude mismatch", 1076*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S interface{} }{ 1077*1fa6dee9SAndroid Build Coastguard Worker S: nil, 1078*1fa6dee9SAndroid Build Coastguard Worker }, 1079*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S interface{} }{ 1080*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S string }{ 1081*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1082*1fa6dee9SAndroid Build Coastguard Worker }, 1083*1fa6dee9SAndroid Build Coastguard Worker }, 1084*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S interface{} }{ 1085*1fa6dee9SAndroid Build Coastguard Worker S: nil, 1086*1fa6dee9SAndroid Build Coastguard Worker }, 1087*1fa6dee9SAndroid Build Coastguard Worker err: extendPropertyErrorf("s", "nilitude mismatch"), 1088*1fa6dee9SAndroid Build Coastguard Worker }, 1089*1fa6dee9SAndroid Build Coastguard Worker { 1090*1fa6dee9SAndroid Build Coastguard Worker name: "Interface type mismatch", 1091*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S interface{} }{ 1092*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ A string }{ 1093*1fa6dee9SAndroid Build Coastguard Worker A: "string1", 1094*1fa6dee9SAndroid Build Coastguard Worker }, 1095*1fa6dee9SAndroid Build Coastguard Worker }, 1096*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S interface{} }{ 1097*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ B string }{ 1098*1fa6dee9SAndroid Build Coastguard Worker B: "string2", 1099*1fa6dee9SAndroid Build Coastguard Worker }, 1100*1fa6dee9SAndroid Build Coastguard Worker }, 1101*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S interface{} }{ 1102*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ A string }{ 1103*1fa6dee9SAndroid Build Coastguard Worker A: "string1", 1104*1fa6dee9SAndroid Build Coastguard Worker }, 1105*1fa6dee9SAndroid Build Coastguard Worker }, 1106*1fa6dee9SAndroid Build Coastguard Worker err: extendPropertyErrorf("s", "mismatched types struct { A string } and struct { B string }"), 1107*1fa6dee9SAndroid Build Coastguard Worker }, 1108*1fa6dee9SAndroid Build Coastguard Worker { 1109*1fa6dee9SAndroid Build Coastguard Worker name: "Interface not a pointer", 1110*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S interface{} }{ 1111*1fa6dee9SAndroid Build Coastguard Worker S: struct{ S string }{ 1112*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1113*1fa6dee9SAndroid Build Coastguard Worker }, 1114*1fa6dee9SAndroid Build Coastguard Worker }, 1115*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S interface{} }{ 1116*1fa6dee9SAndroid Build Coastguard Worker S: struct{ S string }{ 1117*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1118*1fa6dee9SAndroid Build Coastguard Worker }, 1119*1fa6dee9SAndroid Build Coastguard Worker }, 1120*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S interface{} }{ 1121*1fa6dee9SAndroid Build Coastguard Worker S: struct{ S string }{ 1122*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1123*1fa6dee9SAndroid Build Coastguard Worker }, 1124*1fa6dee9SAndroid Build Coastguard Worker }, 1125*1fa6dee9SAndroid Build Coastguard Worker err: extendPropertyErrorf("s", "interface not a pointer"), 1126*1fa6dee9SAndroid Build Coastguard Worker }, 1127*1fa6dee9SAndroid Build Coastguard Worker { 1128*1fa6dee9SAndroid Build Coastguard Worker name: "Pointer not a struct", 1129*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S *[]string }{ 1130*1fa6dee9SAndroid Build Coastguard Worker S: &[]string{"string1"}, 1131*1fa6dee9SAndroid Build Coastguard Worker }, 1132*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S *[]string }{ 1133*1fa6dee9SAndroid Build Coastguard Worker S: &[]string{"string2"}, 1134*1fa6dee9SAndroid Build Coastguard Worker }, 1135*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S *[]string }{ 1136*1fa6dee9SAndroid Build Coastguard Worker S: &[]string{"string1"}, 1137*1fa6dee9SAndroid Build Coastguard Worker }, 1138*1fa6dee9SAndroid Build Coastguard Worker err: extendPropertyErrorf("s", "pointer is a slice"), 1139*1fa6dee9SAndroid Build Coastguard Worker }, 1140*1fa6dee9SAndroid Build Coastguard Worker { 1141*1fa6dee9SAndroid Build Coastguard Worker name: "Error in nested struct", 1142*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S interface{} }{ 1143*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ I int }{ 1144*1fa6dee9SAndroid Build Coastguard Worker I: 1, 1145*1fa6dee9SAndroid Build Coastguard Worker }, 1146*1fa6dee9SAndroid Build Coastguard Worker }, 1147*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S interface{} }{ 1148*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ I int }{ 1149*1fa6dee9SAndroid Build Coastguard Worker I: 2, 1150*1fa6dee9SAndroid Build Coastguard Worker }, 1151*1fa6dee9SAndroid Build Coastguard Worker }, 1152*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S interface{} }{ 1153*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ I int }{ 1154*1fa6dee9SAndroid Build Coastguard Worker I: 1, 1155*1fa6dee9SAndroid Build Coastguard Worker }, 1156*1fa6dee9SAndroid Build Coastguard Worker }, 1157*1fa6dee9SAndroid Build Coastguard Worker err: extendPropertyErrorf("s.i", "unsupported kind int"), 1158*1fa6dee9SAndroid Build Coastguard Worker }, 1159*1fa6dee9SAndroid Build Coastguard Worker 1160*1fa6dee9SAndroid Build Coastguard Worker // Filters 1161*1fa6dee9SAndroid Build Coastguard Worker 1162*1fa6dee9SAndroid Build Coastguard Worker { 1163*1fa6dee9SAndroid Build Coastguard Worker name: "Filter true", 1164*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S string }{ 1165*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1166*1fa6dee9SAndroid Build Coastguard Worker }, 1167*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S string }{ 1168*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1169*1fa6dee9SAndroid Build Coastguard Worker }, 1170*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S string }{ 1171*1fa6dee9SAndroid Build Coastguard Worker S: "string1string2", 1172*1fa6dee9SAndroid Build Coastguard Worker }, 1173*1fa6dee9SAndroid Build Coastguard Worker filter: func(dstField, srcField reflect.StructField) (bool, error) { 1174*1fa6dee9SAndroid Build Coastguard Worker return true, nil 1175*1fa6dee9SAndroid Build Coastguard Worker }, 1176*1fa6dee9SAndroid Build Coastguard Worker }, 1177*1fa6dee9SAndroid Build Coastguard Worker { 1178*1fa6dee9SAndroid Build Coastguard Worker name: "Filter false", 1179*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S string }{ 1180*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1181*1fa6dee9SAndroid Build Coastguard Worker }, 1182*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S string }{ 1183*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1184*1fa6dee9SAndroid Build Coastguard Worker }, 1185*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S string }{ 1186*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1187*1fa6dee9SAndroid Build Coastguard Worker }, 1188*1fa6dee9SAndroid Build Coastguard Worker filter: func(dstField, srcField reflect.StructField) (bool, error) { 1189*1fa6dee9SAndroid Build Coastguard Worker return false, nil 1190*1fa6dee9SAndroid Build Coastguard Worker }, 1191*1fa6dee9SAndroid Build Coastguard Worker }, 1192*1fa6dee9SAndroid Build Coastguard Worker { 1193*1fa6dee9SAndroid Build Coastguard Worker name: "Filter check args", 1194*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S string }{ 1195*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1196*1fa6dee9SAndroid Build Coastguard Worker }, 1197*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S string }{ 1198*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1199*1fa6dee9SAndroid Build Coastguard Worker }, 1200*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S string }{ 1201*1fa6dee9SAndroid Build Coastguard Worker S: "string1string2", 1202*1fa6dee9SAndroid Build Coastguard Worker }, 1203*1fa6dee9SAndroid Build Coastguard Worker filter: func(dstField, srcField reflect.StructField) (bool, error) { 1204*1fa6dee9SAndroid Build Coastguard Worker return dstField.Name == "S" && srcField.Name == "S", nil 1205*1fa6dee9SAndroid Build Coastguard Worker }, 1206*1fa6dee9SAndroid Build Coastguard Worker }, 1207*1fa6dee9SAndroid Build Coastguard Worker { 1208*1fa6dee9SAndroid Build Coastguard Worker name: "Filter mutated", 1209*1fa6dee9SAndroid Build Coastguard Worker dst: &struct { 1210*1fa6dee9SAndroid Build Coastguard Worker S string `blueprint:"mutated"` 1211*1fa6dee9SAndroid Build Coastguard Worker }{ 1212*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1213*1fa6dee9SAndroid Build Coastguard Worker }, 1214*1fa6dee9SAndroid Build Coastguard Worker src: &struct { 1215*1fa6dee9SAndroid Build Coastguard Worker S string `blueprint:"mutated"` 1216*1fa6dee9SAndroid Build Coastguard Worker }{ 1217*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1218*1fa6dee9SAndroid Build Coastguard Worker }, 1219*1fa6dee9SAndroid Build Coastguard Worker out: &struct { 1220*1fa6dee9SAndroid Build Coastguard Worker S string `blueprint:"mutated"` 1221*1fa6dee9SAndroid Build Coastguard Worker }{ 1222*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1223*1fa6dee9SAndroid Build Coastguard Worker }, 1224*1fa6dee9SAndroid Build Coastguard Worker }, 1225*1fa6dee9SAndroid Build Coastguard Worker { 1226*1fa6dee9SAndroid Build Coastguard Worker name: "Filter mutated", 1227*1fa6dee9SAndroid Build Coastguard Worker dst: &struct { 1228*1fa6dee9SAndroid Build Coastguard Worker S *int64 `blueprint:"mutated"` 1229*1fa6dee9SAndroid Build Coastguard Worker }{ 1230*1fa6dee9SAndroid Build Coastguard Worker S: Int64Ptr(4), 1231*1fa6dee9SAndroid Build Coastguard Worker }, 1232*1fa6dee9SAndroid Build Coastguard Worker src: &struct { 1233*1fa6dee9SAndroid Build Coastguard Worker S *int64 `blueprint:"mutated"` 1234*1fa6dee9SAndroid Build Coastguard Worker }{ 1235*1fa6dee9SAndroid Build Coastguard Worker S: Int64Ptr(5), 1236*1fa6dee9SAndroid Build Coastguard Worker }, 1237*1fa6dee9SAndroid Build Coastguard Worker out: &struct { 1238*1fa6dee9SAndroid Build Coastguard Worker S *int64 `blueprint:"mutated"` 1239*1fa6dee9SAndroid Build Coastguard Worker }{ 1240*1fa6dee9SAndroid Build Coastguard Worker S: Int64Ptr(4), 1241*1fa6dee9SAndroid Build Coastguard Worker }, 1242*1fa6dee9SAndroid Build Coastguard Worker }, 1243*1fa6dee9SAndroid Build Coastguard Worker { 1244*1fa6dee9SAndroid Build Coastguard Worker name: "Filter error", 1245*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S string }{ 1246*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1247*1fa6dee9SAndroid Build Coastguard Worker }, 1248*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S string }{ 1249*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1250*1fa6dee9SAndroid Build Coastguard Worker }, 1251*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S string }{ 1252*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1253*1fa6dee9SAndroid Build Coastguard Worker }, 1254*1fa6dee9SAndroid Build Coastguard Worker filter: func(dstField, srcField reflect.StructField) (bool, error) { 1255*1fa6dee9SAndroid Build Coastguard Worker return true, fmt.Errorf("filter error") 1256*1fa6dee9SAndroid Build Coastguard Worker }, 1257*1fa6dee9SAndroid Build Coastguard Worker err: extendPropertyErrorf("s", "filter error"), 1258*1fa6dee9SAndroid Build Coastguard Worker }, 1259*1fa6dee9SAndroid Build Coastguard Worker { 1260*1fa6dee9SAndroid Build Coastguard Worker name: "Append configurable", 1261*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S Configurable[[]string] }{ 1262*1fa6dee9SAndroid Build Coastguard Worker S: NewConfigurable[[]string]([]ConfigurableCondition{{ 1263*1fa6dee9SAndroid Build Coastguard Worker functionName: "soong_config_variable", 1264*1fa6dee9SAndroid Build Coastguard Worker args: []string{ 1265*1fa6dee9SAndroid Build Coastguard Worker "my_namespace", 1266*1fa6dee9SAndroid Build Coastguard Worker "foo", 1267*1fa6dee9SAndroid Build Coastguard Worker }, 1268*1fa6dee9SAndroid Build Coastguard Worker }}, 1269*1fa6dee9SAndroid Build Coastguard Worker []ConfigurableCase[[]string]{{ 1270*1fa6dee9SAndroid Build Coastguard Worker patterns: []ConfigurablePattern{{ 1271*1fa6dee9SAndroid Build Coastguard Worker typ: configurablePatternTypeString, 1272*1fa6dee9SAndroid Build Coastguard Worker stringValue: "a", 1273*1fa6dee9SAndroid Build Coastguard Worker }}, 1274*1fa6dee9SAndroid Build Coastguard Worker value: &parser.List{Values: []parser.Expression{ 1275*1fa6dee9SAndroid Build Coastguard Worker &parser.String{Value: "1"}, 1276*1fa6dee9SAndroid Build Coastguard Worker &parser.String{Value: "2"}, 1277*1fa6dee9SAndroid Build Coastguard Worker }}, 1278*1fa6dee9SAndroid Build Coastguard Worker }}, 1279*1fa6dee9SAndroid Build Coastguard Worker ), 1280*1fa6dee9SAndroid Build Coastguard Worker }, 1281*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S Configurable[[]string] }{ 1282*1fa6dee9SAndroid Build Coastguard Worker S: NewConfigurable([]ConfigurableCondition{{ 1283*1fa6dee9SAndroid Build Coastguard Worker functionName: "release_variable", 1284*1fa6dee9SAndroid Build Coastguard Worker args: []string{ 1285*1fa6dee9SAndroid Build Coastguard Worker "bar", 1286*1fa6dee9SAndroid Build Coastguard Worker }, 1287*1fa6dee9SAndroid Build Coastguard Worker }}, 1288*1fa6dee9SAndroid Build Coastguard Worker []ConfigurableCase[[]string]{{ 1289*1fa6dee9SAndroid Build Coastguard Worker patterns: []ConfigurablePattern{{ 1290*1fa6dee9SAndroid Build Coastguard Worker typ: configurablePatternTypeString, 1291*1fa6dee9SAndroid Build Coastguard Worker stringValue: "b", 1292*1fa6dee9SAndroid Build Coastguard Worker }}, 1293*1fa6dee9SAndroid Build Coastguard Worker value: &parser.List{Values: []parser.Expression{ 1294*1fa6dee9SAndroid Build Coastguard Worker &parser.String{Value: "3"}, 1295*1fa6dee9SAndroid Build Coastguard Worker &parser.String{Value: "4"}, 1296*1fa6dee9SAndroid Build Coastguard Worker }}, 1297*1fa6dee9SAndroid Build Coastguard Worker }}, 1298*1fa6dee9SAndroid Build Coastguard Worker ), 1299*1fa6dee9SAndroid Build Coastguard Worker }, 1300*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S Configurable[[]string] }{ 1301*1fa6dee9SAndroid Build Coastguard Worker S: func() Configurable[[]string] { 1302*1fa6dee9SAndroid Build Coastguard Worker result := NewConfigurable([]ConfigurableCondition{{ 1303*1fa6dee9SAndroid Build Coastguard Worker functionName: "soong_config_variable", 1304*1fa6dee9SAndroid Build Coastguard Worker args: []string{ 1305*1fa6dee9SAndroid Build Coastguard Worker "my_namespace", 1306*1fa6dee9SAndroid Build Coastguard Worker "foo", 1307*1fa6dee9SAndroid Build Coastguard Worker }, 1308*1fa6dee9SAndroid Build Coastguard Worker }}, 1309*1fa6dee9SAndroid Build Coastguard Worker []ConfigurableCase[[]string]{{ 1310*1fa6dee9SAndroid Build Coastguard Worker patterns: []ConfigurablePattern{{ 1311*1fa6dee9SAndroid Build Coastguard Worker typ: configurablePatternTypeString, 1312*1fa6dee9SAndroid Build Coastguard Worker stringValue: "a", 1313*1fa6dee9SAndroid Build Coastguard Worker }}, 1314*1fa6dee9SAndroid Build Coastguard Worker value: &parser.List{Values: []parser.Expression{ 1315*1fa6dee9SAndroid Build Coastguard Worker &parser.String{Value: "1"}, 1316*1fa6dee9SAndroid Build Coastguard Worker &parser.String{Value: "2"}, 1317*1fa6dee9SAndroid Build Coastguard Worker }}, 1318*1fa6dee9SAndroid Build Coastguard Worker }}, 1319*1fa6dee9SAndroid Build Coastguard Worker ) 1320*1fa6dee9SAndroid Build Coastguard Worker result.Append(NewConfigurable([]ConfigurableCondition{{ 1321*1fa6dee9SAndroid Build Coastguard Worker functionName: "release_variable", 1322*1fa6dee9SAndroid Build Coastguard Worker args: []string{ 1323*1fa6dee9SAndroid Build Coastguard Worker "bar", 1324*1fa6dee9SAndroid Build Coastguard Worker }, 1325*1fa6dee9SAndroid Build Coastguard Worker }}, 1326*1fa6dee9SAndroid Build Coastguard Worker []ConfigurableCase[[]string]{{ 1327*1fa6dee9SAndroid Build Coastguard Worker patterns: []ConfigurablePattern{{ 1328*1fa6dee9SAndroid Build Coastguard Worker typ: configurablePatternTypeString, 1329*1fa6dee9SAndroid Build Coastguard Worker stringValue: "b", 1330*1fa6dee9SAndroid Build Coastguard Worker }}, 1331*1fa6dee9SAndroid Build Coastguard Worker value: &parser.List{Values: []parser.Expression{ 1332*1fa6dee9SAndroid Build Coastguard Worker &parser.String{Value: "3"}, 1333*1fa6dee9SAndroid Build Coastguard Worker &parser.String{Value: "4"}, 1334*1fa6dee9SAndroid Build Coastguard Worker }}, 1335*1fa6dee9SAndroid Build Coastguard Worker }})) 1336*1fa6dee9SAndroid Build Coastguard Worker return result 1337*1fa6dee9SAndroid Build Coastguard Worker }(), 1338*1fa6dee9SAndroid Build Coastguard Worker }, 1339*1fa6dee9SAndroid Build Coastguard Worker }, 1340*1fa6dee9SAndroid Build Coastguard Worker { 1341*1fa6dee9SAndroid Build Coastguard Worker name: "Prepend configurable", 1342*1fa6dee9SAndroid Build Coastguard Worker order: Prepend, 1343*1fa6dee9SAndroid Build Coastguard Worker dst: &struct{ S Configurable[[]string] }{ 1344*1fa6dee9SAndroid Build Coastguard Worker S: NewConfigurable([]ConfigurableCondition{{ 1345*1fa6dee9SAndroid Build Coastguard Worker functionName: "soong_config_variable", 1346*1fa6dee9SAndroid Build Coastguard Worker args: []string{ 1347*1fa6dee9SAndroid Build Coastguard Worker "my_namespace", 1348*1fa6dee9SAndroid Build Coastguard Worker "foo", 1349*1fa6dee9SAndroid Build Coastguard Worker }, 1350*1fa6dee9SAndroid Build Coastguard Worker }}, 1351*1fa6dee9SAndroid Build Coastguard Worker []ConfigurableCase[[]string]{{ 1352*1fa6dee9SAndroid Build Coastguard Worker patterns: []ConfigurablePattern{{ 1353*1fa6dee9SAndroid Build Coastguard Worker typ: configurablePatternTypeString, 1354*1fa6dee9SAndroid Build Coastguard Worker stringValue: "a", 1355*1fa6dee9SAndroid Build Coastguard Worker }}, 1356*1fa6dee9SAndroid Build Coastguard Worker value: &parser.List{Values: []parser.Expression{ 1357*1fa6dee9SAndroid Build Coastguard Worker &parser.String{Value: "1"}, 1358*1fa6dee9SAndroid Build Coastguard Worker &parser.String{Value: "2"}, 1359*1fa6dee9SAndroid Build Coastguard Worker }}, 1360*1fa6dee9SAndroid Build Coastguard Worker }}, 1361*1fa6dee9SAndroid Build Coastguard Worker ), 1362*1fa6dee9SAndroid Build Coastguard Worker }, 1363*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S Configurable[[]string] }{ 1364*1fa6dee9SAndroid Build Coastguard Worker S: NewConfigurable([]ConfigurableCondition{{ 1365*1fa6dee9SAndroid Build Coastguard Worker functionName: "release_variable", 1366*1fa6dee9SAndroid Build Coastguard Worker args: []string{ 1367*1fa6dee9SAndroid Build Coastguard Worker "bar", 1368*1fa6dee9SAndroid Build Coastguard Worker }, 1369*1fa6dee9SAndroid Build Coastguard Worker }}, 1370*1fa6dee9SAndroid Build Coastguard Worker []ConfigurableCase[[]string]{{ 1371*1fa6dee9SAndroid Build Coastguard Worker patterns: []ConfigurablePattern{{ 1372*1fa6dee9SAndroid Build Coastguard Worker typ: configurablePatternTypeString, 1373*1fa6dee9SAndroid Build Coastguard Worker stringValue: "b", 1374*1fa6dee9SAndroid Build Coastguard Worker }}, 1375*1fa6dee9SAndroid Build Coastguard Worker value: &parser.List{Values: []parser.Expression{ 1376*1fa6dee9SAndroid Build Coastguard Worker &parser.String{Value: "3"}, 1377*1fa6dee9SAndroid Build Coastguard Worker &parser.String{Value: "4"}, 1378*1fa6dee9SAndroid Build Coastguard Worker }}, 1379*1fa6dee9SAndroid Build Coastguard Worker }}, 1380*1fa6dee9SAndroid Build Coastguard Worker ), 1381*1fa6dee9SAndroid Build Coastguard Worker }, 1382*1fa6dee9SAndroid Build Coastguard Worker out: &struct{ S Configurable[[]string] }{ 1383*1fa6dee9SAndroid Build Coastguard Worker S: func() Configurable[[]string] { 1384*1fa6dee9SAndroid Build Coastguard Worker result := NewConfigurable( 1385*1fa6dee9SAndroid Build Coastguard Worker []ConfigurableCondition{{ 1386*1fa6dee9SAndroid Build Coastguard Worker functionName: "release_variable", 1387*1fa6dee9SAndroid Build Coastguard Worker args: []string{ 1388*1fa6dee9SAndroid Build Coastguard Worker "bar", 1389*1fa6dee9SAndroid Build Coastguard Worker }, 1390*1fa6dee9SAndroid Build Coastguard Worker }}, 1391*1fa6dee9SAndroid Build Coastguard Worker []ConfigurableCase[[]string]{{ 1392*1fa6dee9SAndroid Build Coastguard Worker patterns: []ConfigurablePattern{{ 1393*1fa6dee9SAndroid Build Coastguard Worker typ: configurablePatternTypeString, 1394*1fa6dee9SAndroid Build Coastguard Worker stringValue: "b", 1395*1fa6dee9SAndroid Build Coastguard Worker }}, 1396*1fa6dee9SAndroid Build Coastguard Worker value: &parser.List{Values: []parser.Expression{ 1397*1fa6dee9SAndroid Build Coastguard Worker &parser.String{Value: "3"}, 1398*1fa6dee9SAndroid Build Coastguard Worker &parser.String{Value: "4"}, 1399*1fa6dee9SAndroid Build Coastguard Worker }}, 1400*1fa6dee9SAndroid Build Coastguard Worker }}, 1401*1fa6dee9SAndroid Build Coastguard Worker ) 1402*1fa6dee9SAndroid Build Coastguard Worker result.Append(NewConfigurable( 1403*1fa6dee9SAndroid Build Coastguard Worker []ConfigurableCondition{{ 1404*1fa6dee9SAndroid Build Coastguard Worker functionName: "soong_config_variable", 1405*1fa6dee9SAndroid Build Coastguard Worker args: []string{ 1406*1fa6dee9SAndroid Build Coastguard Worker "my_namespace", 1407*1fa6dee9SAndroid Build Coastguard Worker "foo", 1408*1fa6dee9SAndroid Build Coastguard Worker }, 1409*1fa6dee9SAndroid Build Coastguard Worker }}, 1410*1fa6dee9SAndroid Build Coastguard Worker []ConfigurableCase[[]string]{{ 1411*1fa6dee9SAndroid Build Coastguard Worker patterns: []ConfigurablePattern{{ 1412*1fa6dee9SAndroid Build Coastguard Worker typ: configurablePatternTypeString, 1413*1fa6dee9SAndroid Build Coastguard Worker stringValue: "a", 1414*1fa6dee9SAndroid Build Coastguard Worker }}, 1415*1fa6dee9SAndroid Build Coastguard Worker value: &parser.List{Values: []parser.Expression{ 1416*1fa6dee9SAndroid Build Coastguard Worker &parser.String{Value: "1"}, 1417*1fa6dee9SAndroid Build Coastguard Worker &parser.String{Value: "2"}, 1418*1fa6dee9SAndroid Build Coastguard Worker }}, 1419*1fa6dee9SAndroid Build Coastguard Worker }})) 1420*1fa6dee9SAndroid Build Coastguard Worker return result 1421*1fa6dee9SAndroid Build Coastguard Worker }(), 1422*1fa6dee9SAndroid Build Coastguard Worker }, 1423*1fa6dee9SAndroid Build Coastguard Worker }, 1424*1fa6dee9SAndroid Build Coastguard Worker } 1425*1fa6dee9SAndroid Build Coastguard Worker} 1426*1fa6dee9SAndroid Build Coastguard Worker 1427*1fa6dee9SAndroid Build Coastguard Workerfunc TestAppendProperties(t *testing.T) { 1428*1fa6dee9SAndroid Build Coastguard Worker for _, testCase := range appendPropertiesTestCases() { 1429*1fa6dee9SAndroid Build Coastguard Worker t.Run(testCase.name, func(t *testing.T) { 1430*1fa6dee9SAndroid Build Coastguard Worker 1431*1fa6dee9SAndroid Build Coastguard Worker got := testCase.dst 1432*1fa6dee9SAndroid Build Coastguard Worker var err error 1433*1fa6dee9SAndroid Build Coastguard Worker var testType string 1434*1fa6dee9SAndroid Build Coastguard Worker 1435*1fa6dee9SAndroid Build Coastguard Worker switch testCase.order { 1436*1fa6dee9SAndroid Build Coastguard Worker case Append: 1437*1fa6dee9SAndroid Build Coastguard Worker testType = "append" 1438*1fa6dee9SAndroid Build Coastguard Worker err = AppendProperties(got, testCase.src, testCase.filter) 1439*1fa6dee9SAndroid Build Coastguard Worker case Prepend: 1440*1fa6dee9SAndroid Build Coastguard Worker testType = "prepend" 1441*1fa6dee9SAndroid Build Coastguard Worker err = PrependProperties(got, testCase.src, testCase.filter) 1442*1fa6dee9SAndroid Build Coastguard Worker case Replace: 1443*1fa6dee9SAndroid Build Coastguard Worker testType = "replace" 1444*1fa6dee9SAndroid Build Coastguard Worker err = ExtendProperties(got, testCase.src, testCase.filter, OrderReplace) 1445*1fa6dee9SAndroid Build Coastguard Worker } 1446*1fa6dee9SAndroid Build Coastguard Worker 1447*1fa6dee9SAndroid Build Coastguard Worker check(t, testType, testCase.name, got, err, testCase.out, testCase.err) 1448*1fa6dee9SAndroid Build Coastguard Worker }) 1449*1fa6dee9SAndroid Build Coastguard Worker } 1450*1fa6dee9SAndroid Build Coastguard Worker} 1451*1fa6dee9SAndroid Build Coastguard Worker 1452*1fa6dee9SAndroid Build Coastguard Workerfunc TestExtendProperties(t *testing.T) { 1453*1fa6dee9SAndroid Build Coastguard Worker for _, testCase := range appendPropertiesTestCases() { 1454*1fa6dee9SAndroid Build Coastguard Worker t.Run(testCase.name, func(t *testing.T) { 1455*1fa6dee9SAndroid Build Coastguard Worker 1456*1fa6dee9SAndroid Build Coastguard Worker got := testCase.dst 1457*1fa6dee9SAndroid Build Coastguard Worker var err error 1458*1fa6dee9SAndroid Build Coastguard Worker var testType string 1459*1fa6dee9SAndroid Build Coastguard Worker 1460*1fa6dee9SAndroid Build Coastguard Worker order := func(dstField, srcField reflect.StructField) (Order, error) { 1461*1fa6dee9SAndroid Build Coastguard Worker switch testCase.order { 1462*1fa6dee9SAndroid Build Coastguard Worker case Append: 1463*1fa6dee9SAndroid Build Coastguard Worker return Append, nil 1464*1fa6dee9SAndroid Build Coastguard Worker case Prepend: 1465*1fa6dee9SAndroid Build Coastguard Worker return Prepend, nil 1466*1fa6dee9SAndroid Build Coastguard Worker case Replace: 1467*1fa6dee9SAndroid Build Coastguard Worker return Replace, nil 1468*1fa6dee9SAndroid Build Coastguard Worker } 1469*1fa6dee9SAndroid Build Coastguard Worker return Append, errors.New("unknown order") 1470*1fa6dee9SAndroid Build Coastguard Worker } 1471*1fa6dee9SAndroid Build Coastguard Worker 1472*1fa6dee9SAndroid Build Coastguard Worker switch testCase.order { 1473*1fa6dee9SAndroid Build Coastguard Worker case Append: 1474*1fa6dee9SAndroid Build Coastguard Worker testType = "prepend" 1475*1fa6dee9SAndroid Build Coastguard Worker case Prepend: 1476*1fa6dee9SAndroid Build Coastguard Worker testType = "append" 1477*1fa6dee9SAndroid Build Coastguard Worker case Replace: 1478*1fa6dee9SAndroid Build Coastguard Worker testType = "replace" 1479*1fa6dee9SAndroid Build Coastguard Worker } 1480*1fa6dee9SAndroid Build Coastguard Worker 1481*1fa6dee9SAndroid Build Coastguard Worker err = ExtendProperties(got, testCase.src, testCase.filter, order) 1482*1fa6dee9SAndroid Build Coastguard Worker 1483*1fa6dee9SAndroid Build Coastguard Worker check(t, testType, testCase.name, got, err, testCase.out, testCase.err) 1484*1fa6dee9SAndroid Build Coastguard Worker }) 1485*1fa6dee9SAndroid Build Coastguard Worker } 1486*1fa6dee9SAndroid Build Coastguard Worker} 1487*1fa6dee9SAndroid Build Coastguard Worker 1488*1fa6dee9SAndroid Build Coastguard Workertype appendMatchingPropertiesTestCase struct { 1489*1fa6dee9SAndroid Build Coastguard Worker name string 1490*1fa6dee9SAndroid Build Coastguard Worker dst []interface{} 1491*1fa6dee9SAndroid Build Coastguard Worker src interface{} 1492*1fa6dee9SAndroid Build Coastguard Worker out []interface{} 1493*1fa6dee9SAndroid Build Coastguard Worker order Order // default is Append 1494*1fa6dee9SAndroid Build Coastguard Worker filter ExtendPropertyFilterFunc 1495*1fa6dee9SAndroid Build Coastguard Worker err error 1496*1fa6dee9SAndroid Build Coastguard Worker} 1497*1fa6dee9SAndroid Build Coastguard Worker 1498*1fa6dee9SAndroid Build Coastguard Workerfunc appendMatchingPropertiesTestCases() []appendMatchingPropertiesTestCase { 1499*1fa6dee9SAndroid Build Coastguard Worker return []appendMatchingPropertiesTestCase{ 1500*1fa6dee9SAndroid Build Coastguard Worker { 1501*1fa6dee9SAndroid Build Coastguard Worker name: "Append strings", 1502*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{&struct{ S string }{ 1503*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1504*1fa6dee9SAndroid Build Coastguard Worker }}, 1505*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S string }{ 1506*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1507*1fa6dee9SAndroid Build Coastguard Worker }, 1508*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{&struct{ S string }{ 1509*1fa6dee9SAndroid Build Coastguard Worker S: "string1string2", 1510*1fa6dee9SAndroid Build Coastguard Worker }}, 1511*1fa6dee9SAndroid Build Coastguard Worker }, 1512*1fa6dee9SAndroid Build Coastguard Worker { 1513*1fa6dee9SAndroid Build Coastguard Worker name: "Prepend strings", 1514*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{&struct{ S string }{ 1515*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1516*1fa6dee9SAndroid Build Coastguard Worker }}, 1517*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S string }{ 1518*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1519*1fa6dee9SAndroid Build Coastguard Worker }, 1520*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{&struct{ S string }{ 1521*1fa6dee9SAndroid Build Coastguard Worker S: "string2string1", 1522*1fa6dee9SAndroid Build Coastguard Worker }}, 1523*1fa6dee9SAndroid Build Coastguard Worker order: Prepend, 1524*1fa6dee9SAndroid Build Coastguard Worker }, 1525*1fa6dee9SAndroid Build Coastguard Worker { 1526*1fa6dee9SAndroid Build Coastguard Worker name: "Append all", 1527*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{ 1528*1fa6dee9SAndroid Build Coastguard Worker &struct{ S, A string }{ 1529*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1530*1fa6dee9SAndroid Build Coastguard Worker }, 1531*1fa6dee9SAndroid Build Coastguard Worker &struct{ S, B string }{ 1532*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1533*1fa6dee9SAndroid Build Coastguard Worker }, 1534*1fa6dee9SAndroid Build Coastguard Worker }, 1535*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S string }{ 1536*1fa6dee9SAndroid Build Coastguard Worker S: "string3", 1537*1fa6dee9SAndroid Build Coastguard Worker }, 1538*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{ 1539*1fa6dee9SAndroid Build Coastguard Worker &struct{ S, A string }{ 1540*1fa6dee9SAndroid Build Coastguard Worker S: "string1string3", 1541*1fa6dee9SAndroid Build Coastguard Worker }, 1542*1fa6dee9SAndroid Build Coastguard Worker &struct{ S, B string }{ 1543*1fa6dee9SAndroid Build Coastguard Worker S: "string2string3", 1544*1fa6dee9SAndroid Build Coastguard Worker }, 1545*1fa6dee9SAndroid Build Coastguard Worker }, 1546*1fa6dee9SAndroid Build Coastguard Worker }, 1547*1fa6dee9SAndroid Build Coastguard Worker { 1548*1fa6dee9SAndroid Build Coastguard Worker name: "Append some", 1549*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{ 1550*1fa6dee9SAndroid Build Coastguard Worker &struct{ S, A string }{ 1551*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1552*1fa6dee9SAndroid Build Coastguard Worker }, 1553*1fa6dee9SAndroid Build Coastguard Worker &struct{ B string }{}, 1554*1fa6dee9SAndroid Build Coastguard Worker }, 1555*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S string }{ 1556*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1557*1fa6dee9SAndroid Build Coastguard Worker }, 1558*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{ 1559*1fa6dee9SAndroid Build Coastguard Worker &struct{ S, A string }{ 1560*1fa6dee9SAndroid Build Coastguard Worker S: "string1string2", 1561*1fa6dee9SAndroid Build Coastguard Worker }, 1562*1fa6dee9SAndroid Build Coastguard Worker &struct{ B string }{}, 1563*1fa6dee9SAndroid Build Coastguard Worker }, 1564*1fa6dee9SAndroid Build Coastguard Worker }, 1565*1fa6dee9SAndroid Build Coastguard Worker { 1566*1fa6dee9SAndroid Build Coastguard Worker name: "Append mismatched structs", 1567*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{&struct{ S, A string }{ 1568*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1569*1fa6dee9SAndroid Build Coastguard Worker }}, 1570*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S string }{ 1571*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1572*1fa6dee9SAndroid Build Coastguard Worker }, 1573*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{&struct{ S, A string }{ 1574*1fa6dee9SAndroid Build Coastguard Worker S: "string1string2", 1575*1fa6dee9SAndroid Build Coastguard Worker }}, 1576*1fa6dee9SAndroid Build Coastguard Worker }, 1577*1fa6dee9SAndroid Build Coastguard Worker { 1578*1fa6dee9SAndroid Build Coastguard Worker name: "Append mismatched pointer structs", 1579*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{&struct{ S *struct{ S, A string } }{ 1580*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S, A string }{ 1581*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1582*1fa6dee9SAndroid Build Coastguard Worker }, 1583*1fa6dee9SAndroid Build Coastguard Worker }}, 1584*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S *struct{ S string } }{ 1585*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S string }{ 1586*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1587*1fa6dee9SAndroid Build Coastguard Worker }, 1588*1fa6dee9SAndroid Build Coastguard Worker }, 1589*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{&struct{ S *struct{ S, A string } }{ 1590*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S, A string }{ 1591*1fa6dee9SAndroid Build Coastguard Worker S: "string1string2", 1592*1fa6dee9SAndroid Build Coastguard Worker }, 1593*1fa6dee9SAndroid Build Coastguard Worker }}, 1594*1fa6dee9SAndroid Build Coastguard Worker }, 1595*1fa6dee9SAndroid Build Coastguard Worker { 1596*1fa6dee9SAndroid Build Coastguard Worker name: "Append through mismatched types", 1597*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{ 1598*1fa6dee9SAndroid Build Coastguard Worker &struct{ B string }{}, 1599*1fa6dee9SAndroid Build Coastguard Worker &struct{ S interface{} }{ 1600*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S, A string }{ 1601*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1602*1fa6dee9SAndroid Build Coastguard Worker }, 1603*1fa6dee9SAndroid Build Coastguard Worker }, 1604*1fa6dee9SAndroid Build Coastguard Worker }, 1605*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S struct{ S string } }{ 1606*1fa6dee9SAndroid Build Coastguard Worker S: struct{ S string }{ 1607*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1608*1fa6dee9SAndroid Build Coastguard Worker }, 1609*1fa6dee9SAndroid Build Coastguard Worker }, 1610*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{ 1611*1fa6dee9SAndroid Build Coastguard Worker &struct{ B string }{}, 1612*1fa6dee9SAndroid Build Coastguard Worker &struct{ S interface{} }{ 1613*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S, A string }{ 1614*1fa6dee9SAndroid Build Coastguard Worker S: "string1string2", 1615*1fa6dee9SAndroid Build Coastguard Worker }, 1616*1fa6dee9SAndroid Build Coastguard Worker }, 1617*1fa6dee9SAndroid Build Coastguard Worker }, 1618*1fa6dee9SAndroid Build Coastguard Worker }, 1619*1fa6dee9SAndroid Build Coastguard Worker { 1620*1fa6dee9SAndroid Build Coastguard Worker name: "Append through mismatched types and nil", 1621*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{ 1622*1fa6dee9SAndroid Build Coastguard Worker &struct{ B string }{}, 1623*1fa6dee9SAndroid Build Coastguard Worker &struct{ S interface{} }{ 1624*1fa6dee9SAndroid Build Coastguard Worker S: (*struct{ S, A string })(nil), 1625*1fa6dee9SAndroid Build Coastguard Worker }, 1626*1fa6dee9SAndroid Build Coastguard Worker }, 1627*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S struct{ S string } }{ 1628*1fa6dee9SAndroid Build Coastguard Worker S: struct{ S string }{ 1629*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1630*1fa6dee9SAndroid Build Coastguard Worker }, 1631*1fa6dee9SAndroid Build Coastguard Worker }, 1632*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{ 1633*1fa6dee9SAndroid Build Coastguard Worker &struct{ B string }{}, 1634*1fa6dee9SAndroid Build Coastguard Worker &struct{ S interface{} }{ 1635*1fa6dee9SAndroid Build Coastguard Worker S: &struct{ S, A string }{ 1636*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1637*1fa6dee9SAndroid Build Coastguard Worker }, 1638*1fa6dee9SAndroid Build Coastguard Worker }, 1639*1fa6dee9SAndroid Build Coastguard Worker }, 1640*1fa6dee9SAndroid Build Coastguard Worker }, 1641*1fa6dee9SAndroid Build Coastguard Worker { 1642*1fa6dee9SAndroid Build Coastguard Worker name: "Append through multiple matches", 1643*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{ 1644*1fa6dee9SAndroid Build Coastguard Worker &struct { 1645*1fa6dee9SAndroid Build Coastguard Worker S struct{ S, A string } 1646*1fa6dee9SAndroid Build Coastguard Worker }{ 1647*1fa6dee9SAndroid Build Coastguard Worker S: struct{ S, A string }{ 1648*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1649*1fa6dee9SAndroid Build Coastguard Worker }, 1650*1fa6dee9SAndroid Build Coastguard Worker }, 1651*1fa6dee9SAndroid Build Coastguard Worker &struct { 1652*1fa6dee9SAndroid Build Coastguard Worker S struct{ S, B string } 1653*1fa6dee9SAndroid Build Coastguard Worker }{ 1654*1fa6dee9SAndroid Build Coastguard Worker S: struct{ S, B string }{ 1655*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1656*1fa6dee9SAndroid Build Coastguard Worker }, 1657*1fa6dee9SAndroid Build Coastguard Worker }, 1658*1fa6dee9SAndroid Build Coastguard Worker }, 1659*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S struct{ B string } }{ 1660*1fa6dee9SAndroid Build Coastguard Worker S: struct{ B string }{ 1661*1fa6dee9SAndroid Build Coastguard Worker B: "string3", 1662*1fa6dee9SAndroid Build Coastguard Worker }, 1663*1fa6dee9SAndroid Build Coastguard Worker }, 1664*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{ 1665*1fa6dee9SAndroid Build Coastguard Worker &struct { 1666*1fa6dee9SAndroid Build Coastguard Worker S struct{ S, A string } 1667*1fa6dee9SAndroid Build Coastguard Worker }{ 1668*1fa6dee9SAndroid Build Coastguard Worker S: struct{ S, A string }{ 1669*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1670*1fa6dee9SAndroid Build Coastguard Worker }, 1671*1fa6dee9SAndroid Build Coastguard Worker }, 1672*1fa6dee9SAndroid Build Coastguard Worker &struct { 1673*1fa6dee9SAndroid Build Coastguard Worker S struct{ S, B string } 1674*1fa6dee9SAndroid Build Coastguard Worker }{ 1675*1fa6dee9SAndroid Build Coastguard Worker S: struct{ S, B string }{ 1676*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1677*1fa6dee9SAndroid Build Coastguard Worker B: "string3", 1678*1fa6dee9SAndroid Build Coastguard Worker }, 1679*1fa6dee9SAndroid Build Coastguard Worker }, 1680*1fa6dee9SAndroid Build Coastguard Worker }, 1681*1fa6dee9SAndroid Build Coastguard Worker }, 1682*1fa6dee9SAndroid Build Coastguard Worker { 1683*1fa6dee9SAndroid Build Coastguard Worker name: "Append through embedded struct", 1684*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{ 1685*1fa6dee9SAndroid Build Coastguard Worker &struct{ B string }{}, 1686*1fa6dee9SAndroid Build Coastguard Worker &struct{ EmbeddedStruct }{ 1687*1fa6dee9SAndroid Build Coastguard Worker EmbeddedStruct: EmbeddedStruct{ 1688*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1689*1fa6dee9SAndroid Build Coastguard Worker }, 1690*1fa6dee9SAndroid Build Coastguard Worker }, 1691*1fa6dee9SAndroid Build Coastguard Worker }, 1692*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S string }{ 1693*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1694*1fa6dee9SAndroid Build Coastguard Worker }, 1695*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{ 1696*1fa6dee9SAndroid Build Coastguard Worker &struct{ B string }{}, 1697*1fa6dee9SAndroid Build Coastguard Worker &struct{ EmbeddedStruct }{ 1698*1fa6dee9SAndroid Build Coastguard Worker EmbeddedStruct: EmbeddedStruct{ 1699*1fa6dee9SAndroid Build Coastguard Worker S: "string1string2", 1700*1fa6dee9SAndroid Build Coastguard Worker }, 1701*1fa6dee9SAndroid Build Coastguard Worker }, 1702*1fa6dee9SAndroid Build Coastguard Worker }, 1703*1fa6dee9SAndroid Build Coastguard Worker }, 1704*1fa6dee9SAndroid Build Coastguard Worker { 1705*1fa6dee9SAndroid Build Coastguard Worker name: "Append through BlueprintEmbed struct", 1706*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{ 1707*1fa6dee9SAndroid Build Coastguard Worker &struct{ B string }{}, 1708*1fa6dee9SAndroid Build Coastguard Worker &struct{ BlueprintEmbed EmbeddedStruct }{ 1709*1fa6dee9SAndroid Build Coastguard Worker BlueprintEmbed: EmbeddedStruct{ 1710*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1711*1fa6dee9SAndroid Build Coastguard Worker }, 1712*1fa6dee9SAndroid Build Coastguard Worker }, 1713*1fa6dee9SAndroid Build Coastguard Worker }, 1714*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S string }{ 1715*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1716*1fa6dee9SAndroid Build Coastguard Worker }, 1717*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{ 1718*1fa6dee9SAndroid Build Coastguard Worker &struct{ B string }{}, 1719*1fa6dee9SAndroid Build Coastguard Worker &struct{ BlueprintEmbed EmbeddedStruct }{ 1720*1fa6dee9SAndroid Build Coastguard Worker BlueprintEmbed: EmbeddedStruct{ 1721*1fa6dee9SAndroid Build Coastguard Worker S: "string1string2", 1722*1fa6dee9SAndroid Build Coastguard Worker }, 1723*1fa6dee9SAndroid Build Coastguard Worker }, 1724*1fa6dee9SAndroid Build Coastguard Worker }, 1725*1fa6dee9SAndroid Build Coastguard Worker }, 1726*1fa6dee9SAndroid Build Coastguard Worker { 1727*1fa6dee9SAndroid Build Coastguard Worker name: "Append through embedded pointer to struct", 1728*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{ 1729*1fa6dee9SAndroid Build Coastguard Worker &struct{ B string }{}, 1730*1fa6dee9SAndroid Build Coastguard Worker &struct{ *EmbeddedStruct }{ 1731*1fa6dee9SAndroid Build Coastguard Worker EmbeddedStruct: &EmbeddedStruct{ 1732*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1733*1fa6dee9SAndroid Build Coastguard Worker }, 1734*1fa6dee9SAndroid Build Coastguard Worker }, 1735*1fa6dee9SAndroid Build Coastguard Worker }, 1736*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S string }{ 1737*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1738*1fa6dee9SAndroid Build Coastguard Worker }, 1739*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{ 1740*1fa6dee9SAndroid Build Coastguard Worker &struct{ B string }{}, 1741*1fa6dee9SAndroid Build Coastguard Worker &struct{ *EmbeddedStruct }{ 1742*1fa6dee9SAndroid Build Coastguard Worker EmbeddedStruct: &EmbeddedStruct{ 1743*1fa6dee9SAndroid Build Coastguard Worker S: "string1string2", 1744*1fa6dee9SAndroid Build Coastguard Worker }, 1745*1fa6dee9SAndroid Build Coastguard Worker }, 1746*1fa6dee9SAndroid Build Coastguard Worker }, 1747*1fa6dee9SAndroid Build Coastguard Worker }, 1748*1fa6dee9SAndroid Build Coastguard Worker { 1749*1fa6dee9SAndroid Build Coastguard Worker name: "Append through BlueprintEmbed pointer to struct", 1750*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{ 1751*1fa6dee9SAndroid Build Coastguard Worker &struct{ B string }{}, 1752*1fa6dee9SAndroid Build Coastguard Worker &struct{ BlueprintEmbed *EmbeddedStruct }{ 1753*1fa6dee9SAndroid Build Coastguard Worker BlueprintEmbed: &EmbeddedStruct{ 1754*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1755*1fa6dee9SAndroid Build Coastguard Worker }, 1756*1fa6dee9SAndroid Build Coastguard Worker }, 1757*1fa6dee9SAndroid Build Coastguard Worker }, 1758*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S string }{ 1759*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1760*1fa6dee9SAndroid Build Coastguard Worker }, 1761*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{ 1762*1fa6dee9SAndroid Build Coastguard Worker &struct{ B string }{}, 1763*1fa6dee9SAndroid Build Coastguard Worker &struct{ BlueprintEmbed *EmbeddedStruct }{ 1764*1fa6dee9SAndroid Build Coastguard Worker BlueprintEmbed: &EmbeddedStruct{ 1765*1fa6dee9SAndroid Build Coastguard Worker S: "string1string2", 1766*1fa6dee9SAndroid Build Coastguard Worker }, 1767*1fa6dee9SAndroid Build Coastguard Worker }, 1768*1fa6dee9SAndroid Build Coastguard Worker }, 1769*1fa6dee9SAndroid Build Coastguard Worker }, 1770*1fa6dee9SAndroid Build Coastguard Worker { 1771*1fa6dee9SAndroid Build Coastguard Worker name: "Append through embedded nil pointer to struct", 1772*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{ 1773*1fa6dee9SAndroid Build Coastguard Worker &struct{ B string }{}, 1774*1fa6dee9SAndroid Build Coastguard Worker &struct{ *EmbeddedStruct }{}, 1775*1fa6dee9SAndroid Build Coastguard Worker }, 1776*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S string }{ 1777*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1778*1fa6dee9SAndroid Build Coastguard Worker }, 1779*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{ 1780*1fa6dee9SAndroid Build Coastguard Worker &struct{ B string }{}, 1781*1fa6dee9SAndroid Build Coastguard Worker &struct{ *EmbeddedStruct }{ 1782*1fa6dee9SAndroid Build Coastguard Worker EmbeddedStruct: &EmbeddedStruct{ 1783*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1784*1fa6dee9SAndroid Build Coastguard Worker }, 1785*1fa6dee9SAndroid Build Coastguard Worker }, 1786*1fa6dee9SAndroid Build Coastguard Worker }, 1787*1fa6dee9SAndroid Build Coastguard Worker }, 1788*1fa6dee9SAndroid Build Coastguard Worker { 1789*1fa6dee9SAndroid Build Coastguard Worker name: "Append through BlueprintEmbed nil pointer to struct", 1790*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{ 1791*1fa6dee9SAndroid Build Coastguard Worker &struct{ B string }{}, 1792*1fa6dee9SAndroid Build Coastguard Worker &struct{ BlueprintEmbed *EmbeddedStruct }{}, 1793*1fa6dee9SAndroid Build Coastguard Worker }, 1794*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S string }{ 1795*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1796*1fa6dee9SAndroid Build Coastguard Worker }, 1797*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{ 1798*1fa6dee9SAndroid Build Coastguard Worker &struct{ B string }{}, 1799*1fa6dee9SAndroid Build Coastguard Worker &struct{ BlueprintEmbed *EmbeddedStruct }{ 1800*1fa6dee9SAndroid Build Coastguard Worker BlueprintEmbed: &EmbeddedStruct{ 1801*1fa6dee9SAndroid Build Coastguard Worker S: "string2", 1802*1fa6dee9SAndroid Build Coastguard Worker }, 1803*1fa6dee9SAndroid Build Coastguard Worker }, 1804*1fa6dee9SAndroid Build Coastguard Worker }, 1805*1fa6dee9SAndroid Build Coastguard Worker }, 1806*1fa6dee9SAndroid Build Coastguard Worker 1807*1fa6dee9SAndroid Build Coastguard Worker // Errors 1808*1fa6dee9SAndroid Build Coastguard Worker 1809*1fa6dee9SAndroid Build Coastguard Worker { 1810*1fa6dee9SAndroid Build Coastguard Worker name: "Non-pointer dst", 1811*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{struct{}{}}, 1812*1fa6dee9SAndroid Build Coastguard Worker src: &struct{}{}, 1813*1fa6dee9SAndroid Build Coastguard Worker err: errors.New("expected pointer to struct, got struct {}"), 1814*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{struct{}{}}, 1815*1fa6dee9SAndroid Build Coastguard Worker }, 1816*1fa6dee9SAndroid Build Coastguard Worker { 1817*1fa6dee9SAndroid Build Coastguard Worker name: "Non-pointer src", 1818*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{&struct{}{}}, 1819*1fa6dee9SAndroid Build Coastguard Worker src: struct{}{}, 1820*1fa6dee9SAndroid Build Coastguard Worker err: errors.New("expected pointer to struct, got struct {}"), 1821*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{&struct{}{}}, 1822*1fa6dee9SAndroid Build Coastguard Worker }, 1823*1fa6dee9SAndroid Build Coastguard Worker { 1824*1fa6dee9SAndroid Build Coastguard Worker name: "Non-struct dst", 1825*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{&[]string{"bad"}}, 1826*1fa6dee9SAndroid Build Coastguard Worker src: &struct{}{}, 1827*1fa6dee9SAndroid Build Coastguard Worker err: errors.New("expected pointer to struct, got *[]string"), 1828*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{&[]string{"bad"}}, 1829*1fa6dee9SAndroid Build Coastguard Worker }, 1830*1fa6dee9SAndroid Build Coastguard Worker { 1831*1fa6dee9SAndroid Build Coastguard Worker name: "Non-struct src", 1832*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{&struct{}{}}, 1833*1fa6dee9SAndroid Build Coastguard Worker src: &[]string{"bad"}, 1834*1fa6dee9SAndroid Build Coastguard Worker err: errors.New("expected pointer to struct, got *[]string"), 1835*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{&struct{}{}}, 1836*1fa6dee9SAndroid Build Coastguard Worker }, 1837*1fa6dee9SAndroid Build Coastguard Worker { 1838*1fa6dee9SAndroid Build Coastguard Worker name: "Append none", 1839*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{ 1840*1fa6dee9SAndroid Build Coastguard Worker &struct{ A string }{}, 1841*1fa6dee9SAndroid Build Coastguard Worker &struct{ B string }{}, 1842*1fa6dee9SAndroid Build Coastguard Worker }, 1843*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S string }{ 1844*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1845*1fa6dee9SAndroid Build Coastguard Worker }, 1846*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{ 1847*1fa6dee9SAndroid Build Coastguard Worker &struct{ A string }{}, 1848*1fa6dee9SAndroid Build Coastguard Worker &struct{ B string }{}, 1849*1fa6dee9SAndroid Build Coastguard Worker }, 1850*1fa6dee9SAndroid Build Coastguard Worker err: extendPropertyErrorf("s", "failed to find property to extend"), 1851*1fa6dee9SAndroid Build Coastguard Worker }, 1852*1fa6dee9SAndroid Build Coastguard Worker { 1853*1fa6dee9SAndroid Build Coastguard Worker name: "Append mismatched kinds", 1854*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{ 1855*1fa6dee9SAndroid Build Coastguard Worker &struct{ S string }{ 1856*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1857*1fa6dee9SAndroid Build Coastguard Worker }, 1858*1fa6dee9SAndroid Build Coastguard Worker }, 1859*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S []string }{ 1860*1fa6dee9SAndroid Build Coastguard Worker S: []string{"string2"}, 1861*1fa6dee9SAndroid Build Coastguard Worker }, 1862*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{ 1863*1fa6dee9SAndroid Build Coastguard Worker &struct{ S string }{ 1864*1fa6dee9SAndroid Build Coastguard Worker S: "string1", 1865*1fa6dee9SAndroid Build Coastguard Worker }, 1866*1fa6dee9SAndroid Build Coastguard Worker }, 1867*1fa6dee9SAndroid Build Coastguard Worker err: extendPropertyErrorf("s", "mismatched types string and []string"), 1868*1fa6dee9SAndroid Build Coastguard Worker }, 1869*1fa6dee9SAndroid Build Coastguard Worker { 1870*1fa6dee9SAndroid Build Coastguard Worker name: "Append mismatched types", 1871*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{ 1872*1fa6dee9SAndroid Build Coastguard Worker &struct{ S []int }{ 1873*1fa6dee9SAndroid Build Coastguard Worker S: []int{1}, 1874*1fa6dee9SAndroid Build Coastguard Worker }, 1875*1fa6dee9SAndroid Build Coastguard Worker }, 1876*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S []string }{ 1877*1fa6dee9SAndroid Build Coastguard Worker S: []string{"string2"}, 1878*1fa6dee9SAndroid Build Coastguard Worker }, 1879*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{ 1880*1fa6dee9SAndroid Build Coastguard Worker &struct{ S []int }{ 1881*1fa6dee9SAndroid Build Coastguard Worker S: []int{1}, 1882*1fa6dee9SAndroid Build Coastguard Worker }, 1883*1fa6dee9SAndroid Build Coastguard Worker }, 1884*1fa6dee9SAndroid Build Coastguard Worker err: extendPropertyErrorf("s", "mismatched types []int and []string"), 1885*1fa6dee9SAndroid Build Coastguard Worker }, 1886*1fa6dee9SAndroid Build Coastguard Worker { 1887*1fa6dee9SAndroid Build Coastguard Worker name: "Append *bool to Configurable[bool]", 1888*1fa6dee9SAndroid Build Coastguard Worker order: Append, 1889*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{ 1890*1fa6dee9SAndroid Build Coastguard Worker &struct{ S Configurable[bool] }{ 1891*1fa6dee9SAndroid Build Coastguard Worker S: NewConfigurable[bool]([]ConfigurableCondition{{ 1892*1fa6dee9SAndroid Build Coastguard Worker functionName: "soong_config_variable", 1893*1fa6dee9SAndroid Build Coastguard Worker args: []string{ 1894*1fa6dee9SAndroid Build Coastguard Worker "my_namespace", 1895*1fa6dee9SAndroid Build Coastguard Worker "foo", 1896*1fa6dee9SAndroid Build Coastguard Worker }, 1897*1fa6dee9SAndroid Build Coastguard Worker }}, []ConfigurableCase[bool]{{ 1898*1fa6dee9SAndroid Build Coastguard Worker patterns: []ConfigurablePattern{{ 1899*1fa6dee9SAndroid Build Coastguard Worker typ: configurablePatternTypeString, 1900*1fa6dee9SAndroid Build Coastguard Worker stringValue: "a", 1901*1fa6dee9SAndroid Build Coastguard Worker }}, 1902*1fa6dee9SAndroid Build Coastguard Worker value: &parser.Bool{Value: true}, 1903*1fa6dee9SAndroid Build Coastguard Worker }, { 1904*1fa6dee9SAndroid Build Coastguard Worker patterns: []ConfigurablePattern{{ 1905*1fa6dee9SAndroid Build Coastguard Worker typ: configurablePatternTypeDefault, 1906*1fa6dee9SAndroid Build Coastguard Worker }}, 1907*1fa6dee9SAndroid Build Coastguard Worker value: &parser.Bool{Value: false}, 1908*1fa6dee9SAndroid Build Coastguard Worker }}), 1909*1fa6dee9SAndroid Build Coastguard Worker }, 1910*1fa6dee9SAndroid Build Coastguard Worker }, 1911*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S *bool }{ 1912*1fa6dee9SAndroid Build Coastguard Worker S: BoolPtr(true), 1913*1fa6dee9SAndroid Build Coastguard Worker }, 1914*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{ 1915*1fa6dee9SAndroid Build Coastguard Worker &struct{ S Configurable[bool] }{ 1916*1fa6dee9SAndroid Build Coastguard Worker S: func() Configurable[bool] { 1917*1fa6dee9SAndroid Build Coastguard Worker result := NewConfigurable[bool]([]ConfigurableCondition{{ 1918*1fa6dee9SAndroid Build Coastguard Worker functionName: "soong_config_variable", 1919*1fa6dee9SAndroid Build Coastguard Worker args: []string{ 1920*1fa6dee9SAndroid Build Coastguard Worker "my_namespace", 1921*1fa6dee9SAndroid Build Coastguard Worker "foo", 1922*1fa6dee9SAndroid Build Coastguard Worker }, 1923*1fa6dee9SAndroid Build Coastguard Worker }}, 1924*1fa6dee9SAndroid Build Coastguard Worker []ConfigurableCase[bool]{{ 1925*1fa6dee9SAndroid Build Coastguard Worker patterns: []ConfigurablePattern{{ 1926*1fa6dee9SAndroid Build Coastguard Worker typ: configurablePatternTypeString, 1927*1fa6dee9SAndroid Build Coastguard Worker stringValue: "a", 1928*1fa6dee9SAndroid Build Coastguard Worker }}, 1929*1fa6dee9SAndroid Build Coastguard Worker value: &parser.Bool{Value: true}, 1930*1fa6dee9SAndroid Build Coastguard Worker }, { 1931*1fa6dee9SAndroid Build Coastguard Worker patterns: []ConfigurablePattern{{ 1932*1fa6dee9SAndroid Build Coastguard Worker typ: configurablePatternTypeDefault, 1933*1fa6dee9SAndroid Build Coastguard Worker }}, 1934*1fa6dee9SAndroid Build Coastguard Worker value: &parser.Bool{Value: false}, 1935*1fa6dee9SAndroid Build Coastguard Worker }}, 1936*1fa6dee9SAndroid Build Coastguard Worker ) 1937*1fa6dee9SAndroid Build Coastguard Worker result.AppendSimpleValue(true) 1938*1fa6dee9SAndroid Build Coastguard Worker return result 1939*1fa6dee9SAndroid Build Coastguard Worker }(), 1940*1fa6dee9SAndroid Build Coastguard Worker }, 1941*1fa6dee9SAndroid Build Coastguard Worker }, 1942*1fa6dee9SAndroid Build Coastguard Worker }, 1943*1fa6dee9SAndroid Build Coastguard Worker { 1944*1fa6dee9SAndroid Build Coastguard Worker name: "Append bool to Configurable[bool]", 1945*1fa6dee9SAndroid Build Coastguard Worker order: Append, 1946*1fa6dee9SAndroid Build Coastguard Worker dst: []interface{}{ 1947*1fa6dee9SAndroid Build Coastguard Worker &struct{ S Configurable[bool] }{ 1948*1fa6dee9SAndroid Build Coastguard Worker S: NewConfigurable[bool]([]ConfigurableCondition{{ 1949*1fa6dee9SAndroid Build Coastguard Worker functionName: "soong_config_variable", 1950*1fa6dee9SAndroid Build Coastguard Worker args: []string{ 1951*1fa6dee9SAndroid Build Coastguard Worker "my_namespace", 1952*1fa6dee9SAndroid Build Coastguard Worker "foo", 1953*1fa6dee9SAndroid Build Coastguard Worker }, 1954*1fa6dee9SAndroid Build Coastguard Worker }}, 1955*1fa6dee9SAndroid Build Coastguard Worker []ConfigurableCase[bool]{{ 1956*1fa6dee9SAndroid Build Coastguard Worker patterns: []ConfigurablePattern{{ 1957*1fa6dee9SAndroid Build Coastguard Worker typ: configurablePatternTypeString, 1958*1fa6dee9SAndroid Build Coastguard Worker stringValue: "a", 1959*1fa6dee9SAndroid Build Coastguard Worker }}, 1960*1fa6dee9SAndroid Build Coastguard Worker value: &parser.Bool{Value: true}, 1961*1fa6dee9SAndroid Build Coastguard Worker }, { 1962*1fa6dee9SAndroid Build Coastguard Worker patterns: []ConfigurablePattern{{ 1963*1fa6dee9SAndroid Build Coastguard Worker typ: configurablePatternTypeDefault, 1964*1fa6dee9SAndroid Build Coastguard Worker }}, 1965*1fa6dee9SAndroid Build Coastguard Worker value: &parser.Bool{Value: false}, 1966*1fa6dee9SAndroid Build Coastguard Worker }}, 1967*1fa6dee9SAndroid Build Coastguard Worker ), 1968*1fa6dee9SAndroid Build Coastguard Worker }, 1969*1fa6dee9SAndroid Build Coastguard Worker }, 1970*1fa6dee9SAndroid Build Coastguard Worker src: &struct{ S bool }{ 1971*1fa6dee9SAndroid Build Coastguard Worker S: true, 1972*1fa6dee9SAndroid Build Coastguard Worker }, 1973*1fa6dee9SAndroid Build Coastguard Worker out: []interface{}{ 1974*1fa6dee9SAndroid Build Coastguard Worker &struct{ S Configurable[bool] }{ 1975*1fa6dee9SAndroid Build Coastguard Worker S: func() Configurable[bool] { 1976*1fa6dee9SAndroid Build Coastguard Worker result := NewConfigurable[bool]( 1977*1fa6dee9SAndroid Build Coastguard Worker []ConfigurableCondition{{ 1978*1fa6dee9SAndroid Build Coastguard Worker functionName: "soong_config_variable", 1979*1fa6dee9SAndroid Build Coastguard Worker args: []string{ 1980*1fa6dee9SAndroid Build Coastguard Worker "my_namespace", 1981*1fa6dee9SAndroid Build Coastguard Worker "foo", 1982*1fa6dee9SAndroid Build Coastguard Worker }, 1983*1fa6dee9SAndroid Build Coastguard Worker }}, 1984*1fa6dee9SAndroid Build Coastguard Worker []ConfigurableCase[bool]{{ 1985*1fa6dee9SAndroid Build Coastguard Worker patterns: []ConfigurablePattern{{ 1986*1fa6dee9SAndroid Build Coastguard Worker typ: configurablePatternTypeString, 1987*1fa6dee9SAndroid Build Coastguard Worker stringValue: "a", 1988*1fa6dee9SAndroid Build Coastguard Worker }}, 1989*1fa6dee9SAndroid Build Coastguard Worker value: &parser.Bool{Value: true}, 1990*1fa6dee9SAndroid Build Coastguard Worker }, { 1991*1fa6dee9SAndroid Build Coastguard Worker patterns: []ConfigurablePattern{{ 1992*1fa6dee9SAndroid Build Coastguard Worker typ: configurablePatternTypeDefault, 1993*1fa6dee9SAndroid Build Coastguard Worker }}, 1994*1fa6dee9SAndroid Build Coastguard Worker value: &parser.Bool{Value: false}, 1995*1fa6dee9SAndroid Build Coastguard Worker }}, 1996*1fa6dee9SAndroid Build Coastguard Worker ) 1997*1fa6dee9SAndroid Build Coastguard Worker result.AppendSimpleValue(true) 1998*1fa6dee9SAndroid Build Coastguard Worker return result 1999*1fa6dee9SAndroid Build Coastguard Worker }(), 2000*1fa6dee9SAndroid Build Coastguard Worker }, 2001*1fa6dee9SAndroid Build Coastguard Worker }, 2002*1fa6dee9SAndroid Build Coastguard Worker }, 2003*1fa6dee9SAndroid Build Coastguard Worker } 2004*1fa6dee9SAndroid Build Coastguard Worker} 2005*1fa6dee9SAndroid Build Coastguard Worker 2006*1fa6dee9SAndroid Build Coastguard Workerfunc TestAppendMatchingProperties(t *testing.T) { 2007*1fa6dee9SAndroid Build Coastguard Worker for _, testCase := range appendMatchingPropertiesTestCases() { 2008*1fa6dee9SAndroid Build Coastguard Worker t.Run(testCase.name, func(t *testing.T) { 2009*1fa6dee9SAndroid Build Coastguard Worker 2010*1fa6dee9SAndroid Build Coastguard Worker got := testCase.dst 2011*1fa6dee9SAndroid Build Coastguard Worker var err error 2012*1fa6dee9SAndroid Build Coastguard Worker var testType string 2013*1fa6dee9SAndroid Build Coastguard Worker 2014*1fa6dee9SAndroid Build Coastguard Worker switch testCase.order { 2015*1fa6dee9SAndroid Build Coastguard Worker case Append: 2016*1fa6dee9SAndroid Build Coastguard Worker testType = "append" 2017*1fa6dee9SAndroid Build Coastguard Worker err = AppendMatchingProperties(got, testCase.src, testCase.filter) 2018*1fa6dee9SAndroid Build Coastguard Worker case Prepend: 2019*1fa6dee9SAndroid Build Coastguard Worker testType = "prepend" 2020*1fa6dee9SAndroid Build Coastguard Worker err = PrependMatchingProperties(got, testCase.src, testCase.filter) 2021*1fa6dee9SAndroid Build Coastguard Worker case Replace: 2022*1fa6dee9SAndroid Build Coastguard Worker testType = "replace" 2023*1fa6dee9SAndroid Build Coastguard Worker err = ExtendMatchingProperties(got, testCase.src, testCase.filter, OrderReplace) 2024*1fa6dee9SAndroid Build Coastguard Worker } 2025*1fa6dee9SAndroid Build Coastguard Worker 2026*1fa6dee9SAndroid Build Coastguard Worker check(t, testType, testCase.name, got, err, testCase.out, testCase.err) 2027*1fa6dee9SAndroid Build Coastguard Worker }) 2028*1fa6dee9SAndroid Build Coastguard Worker } 2029*1fa6dee9SAndroid Build Coastguard Worker} 2030*1fa6dee9SAndroid Build Coastguard Worker 2031*1fa6dee9SAndroid Build Coastguard Workerfunc TestExtendMatchingProperties(t *testing.T) { 2032*1fa6dee9SAndroid Build Coastguard Worker for _, testCase := range appendMatchingPropertiesTestCases() { 2033*1fa6dee9SAndroid Build Coastguard Worker t.Run(testCase.name, func(t *testing.T) { 2034*1fa6dee9SAndroid Build Coastguard Worker 2035*1fa6dee9SAndroid Build Coastguard Worker got := testCase.dst 2036*1fa6dee9SAndroid Build Coastguard Worker var err error 2037*1fa6dee9SAndroid Build Coastguard Worker var testType string 2038*1fa6dee9SAndroid Build Coastguard Worker 2039*1fa6dee9SAndroid Build Coastguard Worker order := func(dstField, srcField reflect.StructField) (Order, error) { 2040*1fa6dee9SAndroid Build Coastguard Worker switch testCase.order { 2041*1fa6dee9SAndroid Build Coastguard Worker case Append: 2042*1fa6dee9SAndroid Build Coastguard Worker return Append, nil 2043*1fa6dee9SAndroid Build Coastguard Worker case Prepend: 2044*1fa6dee9SAndroid Build Coastguard Worker return Prepend, nil 2045*1fa6dee9SAndroid Build Coastguard Worker case Replace: 2046*1fa6dee9SAndroid Build Coastguard Worker return Replace, nil 2047*1fa6dee9SAndroid Build Coastguard Worker } 2048*1fa6dee9SAndroid Build Coastguard Worker return Append, errors.New("unknown order") 2049*1fa6dee9SAndroid Build Coastguard Worker } 2050*1fa6dee9SAndroid Build Coastguard Worker 2051*1fa6dee9SAndroid Build Coastguard Worker switch testCase.order { 2052*1fa6dee9SAndroid Build Coastguard Worker case Append: 2053*1fa6dee9SAndroid Build Coastguard Worker testType = "prepend matching" 2054*1fa6dee9SAndroid Build Coastguard Worker case Prepend: 2055*1fa6dee9SAndroid Build Coastguard Worker testType = "append matching" 2056*1fa6dee9SAndroid Build Coastguard Worker case Replace: 2057*1fa6dee9SAndroid Build Coastguard Worker testType = "replace matching" 2058*1fa6dee9SAndroid Build Coastguard Worker } 2059*1fa6dee9SAndroid Build Coastguard Worker 2060*1fa6dee9SAndroid Build Coastguard Worker err = ExtendMatchingProperties(got, testCase.src, testCase.filter, order) 2061*1fa6dee9SAndroid Build Coastguard Worker 2062*1fa6dee9SAndroid Build Coastguard Worker check(t, testType, testCase.name, got, err, testCase.out, testCase.err) 2063*1fa6dee9SAndroid Build Coastguard Worker }) 2064*1fa6dee9SAndroid Build Coastguard Worker } 2065*1fa6dee9SAndroid Build Coastguard Worker} 2066*1fa6dee9SAndroid Build Coastguard Worker 2067*1fa6dee9SAndroid Build Coastguard Workerfunc check(t *testing.T, testType, testString string, 2068*1fa6dee9SAndroid Build Coastguard Worker got interface{}, err error, 2069*1fa6dee9SAndroid Build Coastguard Worker expected interface{}, expectedErr error) { 2070*1fa6dee9SAndroid Build Coastguard Worker 2071*1fa6dee9SAndroid Build Coastguard Worker printedTestCase := false 2072*1fa6dee9SAndroid Build Coastguard Worker e := func(s string, expected, got interface{}) { 2073*1fa6dee9SAndroid Build Coastguard Worker if !printedTestCase { 2074*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("test case %s: %s", testType, testString) 2075*1fa6dee9SAndroid Build Coastguard Worker printedTestCase = true 2076*1fa6dee9SAndroid Build Coastguard Worker } 2077*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("incorrect %s", s) 2078*1fa6dee9SAndroid Build Coastguard Worker t.Errorf(" expected: %s", p(expected)) 2079*1fa6dee9SAndroid Build Coastguard Worker t.Errorf(" got: %s", p(got)) 2080*1fa6dee9SAndroid Build Coastguard Worker } 2081*1fa6dee9SAndroid Build Coastguard Worker 2082*1fa6dee9SAndroid Build Coastguard Worker if err != nil { 2083*1fa6dee9SAndroid Build Coastguard Worker if expectedErr != nil { 2084*1fa6dee9SAndroid Build Coastguard Worker if err.Error() != expectedErr.Error() { 2085*1fa6dee9SAndroid Build Coastguard Worker e("unexpected error", expectedErr.Error(), err.Error()) 2086*1fa6dee9SAndroid Build Coastguard Worker } 2087*1fa6dee9SAndroid Build Coastguard Worker } else { 2088*1fa6dee9SAndroid Build Coastguard Worker e("unexpected error", nil, err.Error()) 2089*1fa6dee9SAndroid Build Coastguard Worker } 2090*1fa6dee9SAndroid Build Coastguard Worker } else { 2091*1fa6dee9SAndroid Build Coastguard Worker if expectedErr != nil { 2092*1fa6dee9SAndroid Build Coastguard Worker e("missing error", expectedErr, nil) 2093*1fa6dee9SAndroid Build Coastguard Worker } 2094*1fa6dee9SAndroid Build Coastguard Worker } 2095*1fa6dee9SAndroid Build Coastguard Worker 2096*1fa6dee9SAndroid Build Coastguard Worker if !reflect.DeepEqual(expected, got) { 2097*1fa6dee9SAndroid Build Coastguard Worker e("output:", expected, got) 2098*1fa6dee9SAndroid Build Coastguard Worker } 2099*1fa6dee9SAndroid Build Coastguard Worker} 2100*1fa6dee9SAndroid Build Coastguard Worker 2101*1fa6dee9SAndroid Build Coastguard Workerfunc p(in interface{}) string { 2102*1fa6dee9SAndroid Build Coastguard Worker if v, ok := in.([]interface{}); ok { 2103*1fa6dee9SAndroid Build Coastguard Worker s := make([]string, len(v)) 2104*1fa6dee9SAndroid Build Coastguard Worker for i := range v { 2105*1fa6dee9SAndroid Build Coastguard Worker s[i] = fmt.Sprintf("%#v", v[i]) 2106*1fa6dee9SAndroid Build Coastguard Worker } 2107*1fa6dee9SAndroid Build Coastguard Worker return "[" + strings.Join(s, ", ") + "]" 2108*1fa6dee9SAndroid Build Coastguard Worker } else { 2109*1fa6dee9SAndroid Build Coastguard Worker return fmt.Sprintf("%#v", in) 2110*1fa6dee9SAndroid Build Coastguard Worker } 2111*1fa6dee9SAndroid Build Coastguard Worker} 2112