@@ -17,6 +17,9 @@ package api
1717import (
1818 "fmt"
1919 "testing"
20+
21+ "github.com/google/go-cmp/cmp"
22+ "github.com/google/go-cmp/cmp/cmpopts"
2023)
2124
2225func TestCrossReferenceOneOfs (t * testing.T ) {
@@ -214,3 +217,204 @@ func TestCrossReferenceService(t *testing.T) {
214217 t .Errorf ("mismatched model, got=%v, want=%v" , mixin .Model , model )
215218 }
216219}
220+
221+ func TestEnrichSamplesEnumValues (t * testing.T ) {
222+ v_good1 := & EnumValue {Name : "GOOD_1" , Number : 1 }
223+ v_good2 := & EnumValue {Name : "GOOD_2" , Number : 2 }
224+ v_good3 := & EnumValue {Name : "GOOD_3" , Number : 3 }
225+ v_good4 := & EnumValue {Name : "GOOD_4" , Number : 4 }
226+ v_bad_deprecated := & EnumValue {Name : "BAD_DEPRECATED" , Number : 5 , Deprecated : true }
227+ v_bad_default := & EnumValue {Name : "BAD_DEFAULT" , Number : 0 }
228+
229+ testCases := []struct {
230+ name string
231+ values []* EnumValue
232+ wantExamples []* SampleValue
233+ }{
234+ {
235+ name : "more than 3 good values" ,
236+ values : []* EnumValue {v_good1 , v_good2 , v_good3 , v_good4 },
237+ wantExamples : []* SampleValue {
238+ {EnumValue : v_good1 , Index : 0 },
239+ {EnumValue : v_good2 , Index : 1 },
240+ {EnumValue : v_good3 , Index : 2 },
241+ },
242+ },
243+ {
244+ name : "less than 3 good values" ,
245+ values : []* EnumValue {v_good1 , v_good2 , v_bad_deprecated },
246+ wantExamples : []* SampleValue {
247+ {EnumValue : v_good1 , Index : 0 },
248+ {EnumValue : v_good2 , Index : 1 },
249+ },
250+ },
251+ {
252+ name : "no good values" ,
253+ values : []* EnumValue {v_bad_default , v_bad_deprecated },
254+ wantExamples : []* SampleValue {
255+ {EnumValue : v_bad_default , Index : 0 },
256+ {EnumValue : v_bad_deprecated , Index : 1 },
257+ },
258+ },
259+ {
260+ name : "no values" ,
261+ values : []* EnumValue {},
262+ wantExamples : []* SampleValue {},
263+ },
264+ {
265+ name : "mixed good and bad values" ,
266+ values : []* EnumValue {v_bad_default , v_good1 , v_bad_deprecated , v_good2 },
267+ wantExamples : []* SampleValue {
268+ {EnumValue : v_good1 , Index : 0 },
269+ {EnumValue : v_good2 , Index : 1 },
270+ },
271+ },
272+ }
273+
274+ for _ , tc := range testCases {
275+ t .Run (tc .name , func (t * testing.T ) {
276+ enum := & Enum {
277+ Name : "TestEnum" ,
278+ ID : ".test.v1.TestEnum" ,
279+ Package : "test.v1" ,
280+ Values : tc .values ,
281+ }
282+ model := NewTestAPI ([]* Message {}, []* Enum {enum }, []* Service {})
283+ if err := CrossReference (model ); err != nil {
284+ t .Fatalf ("CrossReference() failed: %v" , err )
285+ }
286+
287+ got := enum .ValuesForExamples
288+ if diff := cmp .Diff (tc .wantExamples , got , cmpopts .IgnoreFields (EnumValue {}, "Parent" )); diff != "" {
289+ t .Errorf ("mismatch in ValuesForExamples (-want, +got)\n :%s" , diff )
290+ }
291+ })
292+ }
293+ }
294+
295+ func TestEnrichSamplesOneOfExampleField (t * testing.T ) {
296+ deprecated := & Field {
297+ Name : "deprecated_field" ,
298+ ID : ".test.Message.deprecated_field" ,
299+ Typez : STRING_TYPE ,
300+ IsOneOf : true ,
301+ Deprecated : true ,
302+ }
303+ mapMessage := & Message {
304+ Name : "$map<string, string>" ,
305+ ID : "$map<string, string>" ,
306+ IsMap : true ,
307+ Fields : []* Field {
308+ {Name : "key" , ID : "$map<string, string>.key" , Typez : STRING_TYPE },
309+ {Name : "value" , ID : "$map<string, string>.value" , Typez : STRING_TYPE },
310+ },
311+ }
312+ mapField := & Field {
313+ Name : "map_field" ,
314+ ID : ".test.Message.map_field" ,
315+ Typez : MESSAGE_TYPE ,
316+ TypezID : "$map<string, string>" ,
317+ IsOneOf : true ,
318+ Map : true ,
319+ }
320+ repeated := & Field {
321+ Name : "repeated_field" ,
322+ ID : ".test.Message.repeated_field" ,
323+ Typez : STRING_TYPE ,
324+ Repeated : true ,
325+ IsOneOf : true ,
326+ }
327+ scalar := & Field {
328+ Name : "scalar_field" ,
329+ ID : ".test.Message.scalar_field" ,
330+ Typez : INT32_TYPE ,
331+ IsOneOf : true ,
332+ }
333+ messageField := & Field {
334+ Name : "message_field" ,
335+ ID : ".test.Message.message_field" ,
336+ Typez : MESSAGE_TYPE ,
337+ TypezID : ".test.OneMessage" ,
338+ IsOneOf : true ,
339+ }
340+ anotherMessageField := & Field {
341+ Name : "another_message_field" ,
342+ ID : ".test.Message.another_message_field" ,
343+ Typez : MESSAGE_TYPE ,
344+ TypezID : ".test.AnotherMessage" ,
345+ IsOneOf : true ,
346+ }
347+
348+ testCases := []struct {
349+ name string
350+ fields []* Field
351+ want * Field
352+ }{
353+ {
354+ name : "all types" ,
355+ fields : []* Field {deprecated , mapField , repeated , scalar , messageField },
356+ want : scalar ,
357+ },
358+ {
359+ name : "no primitives" ,
360+ fields : []* Field {deprecated , mapField , repeated , messageField },
361+ want : messageField ,
362+ },
363+ {
364+ name : "only scalars and messages" ,
365+ fields : []* Field {messageField , scalar , anotherMessageField },
366+ want : scalar ,
367+ },
368+ {
369+ name : "no scalars" ,
370+ fields : []* Field {deprecated , mapField , repeated },
371+ want : repeated ,
372+ },
373+ {
374+ name : "only map and deprecated" ,
375+ fields : []* Field {deprecated , mapField },
376+ want : mapField ,
377+ },
378+ {
379+ name : "only deprecated" ,
380+ fields : []* Field {deprecated },
381+ want : deprecated ,
382+ },
383+ }
384+
385+ for _ , tc := range testCases {
386+ t .Run (tc .name , func (t * testing.T ) {
387+ group := & OneOf {
388+ Name : "test_oneof" ,
389+ ID : ".test.Message.test_oneof" ,
390+ Fields : tc .fields ,
391+ }
392+ message := & Message {
393+ Name : "Message" ,
394+ ID : ".test.Message" ,
395+ Package : "test" ,
396+ Fields : tc .fields ,
397+ OneOfs : []* OneOf {group },
398+ }
399+ oneMesage := & Message {
400+ Name : "OneMessage" ,
401+ ID : ".test.OneMessage" ,
402+ Package : "test" ,
403+ }
404+ anotherMessage := & Message {
405+ Name : "AnotherMessage" ,
406+ ID : ".test.AnotherMessage" ,
407+ Package : "test" ,
408+ }
409+ model := NewTestAPI ([]* Message {message , oneMesage , anotherMessage , mapMessage }, []* Enum {}, []* Service {})
410+ if err := CrossReference (model ); err != nil {
411+ t .Fatal (err )
412+ }
413+
414+ got := group .ExampleField
415+ if diff := cmp .Diff (tc .want , got ); diff != "" {
416+ t .Errorf ("mismatch in ExampleField (-want, +got)\n :%s" , diff )
417+ }
418+ })
419+ }
420+ }
0 commit comments