From a9871c2bc39550d7e1a1d1f91df2134891800142 Mon Sep 17 00:00:00 2001 From: inoussa Date: Thu, 11 Sep 2008 00:44:56 +0000 Subject: [PATCH] Part 3 final * simple content header block implementation : TSimpleContentHeaderBlock * XSD/WSDL generator tests : header, simple content header, collection git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@551 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../tests/test_suite/test_generators.pas | 178 ++++++++++++++- wst/trunk/tests/test_suite/test_parsers.pas | 82 +++++++ .../tests/test_suite/test_soap_specific.pas | 208 +++++++++++++++++- wst/trunk/tests/test_suite/wst_test_suite.lpr | 2 +- 4 files changed, 467 insertions(+), 3 deletions(-) diff --git a/wst/trunk/tests/test_suite/test_generators.pas b/wst/trunk/tests/test_suite/test_generators.pas index a0271a8ff..15fc6d859 100644 --- a/wst/trunk/tests/test_suite/test_generators.pas +++ b/wst/trunk/tests/test_suite/test_generators.pas @@ -36,6 +36,10 @@ type procedure class_properties_default(); procedure class_properties_extended_metadata(); procedure class_extent_native_type(); + procedure class_headerblock_derived(); + procedure class_headerblock_simplecontent_derived(); + + procedure array_sequence_collection(); end; TTest_XsdGenerator = class(TTest_CustomXsdGenerator) @@ -45,7 +49,8 @@ type implementation -uses test_suite_utils; +uses + test_suite_utils, xsd_consts; { TTest_CustomXsdGenerator } @@ -254,6 +259,177 @@ begin end; end; +procedure TTest_CustomXsdGenerator.class_headerblock_derived(); +var + tr : TwstPasTreeContainer; + mdl : TPasModule; + cltyp : TPasClassType; + + procedure AddProperty( + const AName, + ATypeName, + ADefault : string; + const AKind : TPropertyType + ); + var + p : TPasProperty; + begin + p := TPasProperty(tr.CreateElement(TPasProperty,AName,cltyp,visDefault,'',0)); + cltyp.Members.Add(p); + p.ReadAccessorName := 'F' + AName; + p.WriteAccessorName := 'F' + AName; + p.VarType := tr.FindElement(ATypeName) as TPasType; + Check( (p.VarType <> nil), Format('Type not found : "%s".',[ATypeName])); + p.VarType.AddRef(); + p.DefaultValue := ADefault; + p.Visibility := visPublished; + p.StoredAccessorName := 'True'; + if ( AKind = ptAttribute ) then + tr.SetPropertyAsAttribute(p,True); + end; + +var + g : IGenerator; + locDoc, locExistDoc : TXMLDocument; +begin + locDoc := nil; + locExistDoc := nil; + tr := TwstPasTreeContainer.Create(); + try + CreateWstInterfaceSymbolTable(tr); + mdl := TPasModule(tr.CreateElement(TPasModule,'class_headerblock_derived',tr.Package,visDefault,'',0)); + tr.Package.Modules.Add(mdl); + mdl.InterfaceSection := TPasSection(tr.CreateElement(TPasSection,'',mdl,visDefault,'',0)); + cltyp := TPasClassType(tr.CreateElement(TPasClassType,'TSampleHeader',mdl.InterfaceSection,visDefault,'',0)); + cltyp.ObjKind := okClass; + cltyp.AncestorType := tr.FindElementNS('THeaderBlock',s_xs) as TPasType; + cltyp.AncestorType.AddRef(); + mdl.InterfaceSection.Declarations.Add(cltyp); + mdl.InterfaceSection.Types.Add(cltyp); + AddProperty('intField','integer','',ptField); + AddProperty('strField','string','',ptField); + AddProperty('floatField','float','',ptField); + AddProperty('strAtt','string','',ptAttribute); + AddProperty('intAtt','integer','',ptAttribute); + + locDoc := CreateDoc(); + g := CreateGenerator(locDoc); + g.Execute(tr,mdl.Name); + WriteXMLFile(locDoc,'.\class_headerblock_derived.xsd'); + locExistDoc := LoadXmlFromFilesList('class_headerblock_derived.xsd'); + Check(CompareNodes(locExistDoc.DocumentElement,locDoc.DocumentElement),'generated document differs from the existent one.'); + finally + ReleaseDomNode(locExistDoc); + ReleaseDomNode(locDoc); + FreeAndNil(tr); + end; +end; + +procedure TTest_CustomXsdGenerator.class_headerblock_simplecontent_derived(); +var + tr : TwstPasTreeContainer; + mdl : TPasModule; + cltyp : TPasClassType; + + procedure AddProperty( + const AName, + ATypeName, + ADefault : string; + const AKind : TPropertyType + ); + var + p : TPasProperty; + begin + p := TPasProperty(tr.CreateElement(TPasProperty,AName,cltyp,visDefault,'',0)); + cltyp.Members.Add(p); + p.ReadAccessorName := 'F' + AName; + p.WriteAccessorName := 'F' + AName; + p.VarType := tr.FindElement(ATypeName) as TPasType; + Check( (p.VarType <> nil), Format('Type not found : "%s".',[ATypeName])); + p.VarType.AddRef(); + p.DefaultValue := ADefault; + p.Visibility := visPublished; + p.StoredAccessorName := 'True'; + if ( AKind = ptAttribute ) then + tr.SetPropertyAsAttribute(p,True); + end; + +var + g : IGenerator; + locDoc, locExistDoc : TXMLDocument; +begin + locDoc := nil; + locExistDoc := nil; + tr := TwstPasTreeContainer.Create(); + try + CreateWstInterfaceSymbolTable(tr); + mdl := TPasModule(tr.CreateElement(TPasModule,'class_headerblock_simplecontent_derived',tr.Package,visDefault,'',0)); + tr.Package.Modules.Add(mdl); + mdl.InterfaceSection := TPasSection(tr.CreateElement(TPasSection,'',mdl,visDefault,'',0)); + cltyp := TPasClassType(tr.CreateElement(TPasClassType,'TSampleHeader',mdl.InterfaceSection,visDefault,'',0)); + cltyp.ObjKind := okClass; + cltyp.AncestorType := tr.FindElementNS('TSimpleContentHeaderBlock',s_xs) as TPasType; + cltyp.AncestorType.AddRef(); + mdl.InterfaceSection.Declarations.Add(cltyp); + mdl.InterfaceSection.Types.Add(cltyp); + AddProperty('strAtt','string','',ptAttribute); + AddProperty('intAtt','integer','',ptAttribute); + + locDoc := CreateDoc(); + g := CreateGenerator(locDoc); + g.Execute(tr,mdl.Name); + WriteXMLFile(locDoc,'.\class_headerblock_simplecontent_derived.xsd'); + locExistDoc := LoadXmlFromFilesList('class_headerblock_simplecontent_derived.xsd'); + Check(CompareNodes(locExistDoc.DocumentElement,locDoc.DocumentElement),'generated document differs from the existent one.'); + finally + ReleaseDomNode(locExistDoc); + ReleaseDomNode(locDoc); + FreeAndNil(tr); + end; +end; + +procedure TTest_CustomXsdGenerator.array_sequence_collection(); +var + tr : TwstPasTreeContainer; + mdl : TPasModule; + cltyp : TPasClassType; + g : IGenerator; + locDoc, locExistDoc : TXMLDocument; + arrayTyp : TPasArrayType; +begin + locDoc := nil; + locExistDoc := nil; + tr := TwstPasTreeContainer.Create(); + try + CreateWstInterfaceSymbolTable(tr); + mdl := TPasModule(tr.CreateElement(TPasModule,'array_sequence_collection',tr.Package,visDefault,'',0)); + tr.RegisterExternalAlias(mdl,'urn:wst-test'); + tr.Package.Modules.Add(mdl); + mdl.InterfaceSection := TPasSection(tr.CreateElement(TPasSection,'',mdl,visDefault,'',0)); + cltyp := TPasClassType(tr.CreateElement(TPasClassType,'TComplexType',mdl.InterfaceSection,visDefault,'',0)); + cltyp.ObjKind := okClass; + cltyp.AncestorType := tr.FindElementNS('TBaseComplexRemotable',s_xs) as TPasType; + cltyp.AncestorType.AddRef(); + mdl.InterfaceSection.Declarations.Add(cltyp); + mdl.InterfaceSection.Types.Add(cltyp); + arrayTyp := tr.CreateArray('TCollectionComplexType',cltyp,'field','field',asScoped); + tr.SetCollectionFlag(arrayTyp,True); + mdl.InterfaceSection.Declarations.Add(arrayTyp); + mdl.InterfaceSection.Types.Add(arrayTyp); + + locDoc := CreateDoc(); + g := CreateGenerator(locDoc); + g.Execute(tr,mdl.Name); + WriteXMLFile(locDoc,'array_sequence_collection.xsd'); + locExistDoc := LoadXmlFromFilesList('array_sequence_collection.xsd'); + Check(CompareNodes(locExistDoc.DocumentElement,locDoc.DocumentElement),'generated document differs from the existent one.'); + finally + ReleaseDomNode(locExistDoc); + ReleaseDomNode(locDoc); + FreeAndNil(tr); + end; +end; + function TTest_CustomXsdGenerator.LoadXmlFromFilesList(const AFileName: string): TXMLDocument; var locFileName : string; diff --git a/wst/trunk/tests/test_suite/test_parsers.pas b/wst/trunk/tests/test_suite/test_parsers.pas index 9acce164e..3a486f823 100644 --- a/wst/trunk/tests/test_suite/test_parsers.pas +++ b/wst/trunk/tests/test_suite/test_parsers.pas @@ -50,6 +50,9 @@ type function LoadComplexType_CollectionSequence_Schema() : TwstPasTreeContainer;virtual;abstract; function LoadComplexType_pascal_class_parent() : TwstPasTreeContainer;virtual;abstract; + + function load_class_headerblock_derived_Schema() : TwstPasTreeContainer;virtual;abstract; + function load_class_headerblock_simplecontent_derived_Schema() : TwstPasTreeContainer;virtual;abstract; published procedure EmptySchema(); @@ -72,6 +75,9 @@ type procedure ComplexType_CollectionSequence(); procedure pascal_class_default_parent(); + + procedure class_headerblock_derived(); + procedure class_headerblock_simplecontent_derived(); end; { TTest_XsdParser } @@ -102,6 +108,9 @@ type function LoadComplexType_CollectionSequence_Schema() : TwstPasTreeContainer;override; function LoadComplexType_pascal_class_parent() : TwstPasTreeContainer;override; + + function load_class_headerblock_derived_Schema() : TwstPasTreeContainer;override; + function load_class_headerblock_simplecontent_derived_Schema() : TwstPasTreeContainer;override; end; { TTest_WsdlParser } @@ -132,6 +141,9 @@ type function LoadComplexType_CollectionSequence_Schema() : TwstPasTreeContainer;override; function LoadComplexType_pascal_class_parent() : TwstPasTreeContainer;override; + + function load_class_headerblock_derived_Schema() : TwstPasTreeContainer;override; + function load_class_headerblock_simplecontent_derived_Schema() : TwstPasTreeContainer;override; published procedure no_binding_style(); procedure signature_last(); @@ -1159,6 +1171,56 @@ begin end; end; +procedure TTest_CustomXsdParser.class_headerblock_derived(); +const s_class_name = 'TSampleHeader'; +var + tr : TwstPasTreeContainer; + mdl : TPasModule; + clsType : TPasClassType; + elt : TPasElement; +begin + tr := load_class_headerblock_derived_Schema(); + try + mdl := tr.FindModule('class_headerblock_derived'); + CheckNotNull(mdl,'class_headerblock_derived'); + elt := tr.FindElement(s_class_name); + CheckNotNull(elt,s_class_name); + CheckEquals(s_class_name,elt.Name); + CheckEquals(s_class_name,tr.GetExternalName(elt)); + CheckIs(elt,TPasClassType); + clsType := elt as TPasClassType; + CheckNotNull(clsType.AncestorType,'AncestorType is null'); + CheckSame(tr.FindElementNS('THeaderBlock',sXSD_NS),clsType.AncestorType); + finally + tr.Free(); + end; +end; + +procedure TTest_CustomXsdParser.class_headerblock_simplecontent_derived(); +const s_class_name = 'TSampleHeader'; +var + tr : TwstPasTreeContainer; + mdl : TPasModule; + clsType : TPasClassType; + elt : TPasElement; +begin + tr := load_class_headerblock_simplecontent_derived_Schema(); + try + mdl := tr.FindModule('class_headerblock_simplecontent_derived'); + CheckNotNull(mdl,'class_headerblock_simplecontent_derived'); + elt := tr.FindElement(s_class_name); + CheckNotNull(elt,s_class_name); + CheckEquals(s_class_name,elt.Name); + CheckEquals(s_class_name,tr.GetExternalName(elt)); + CheckIs(elt,TPasClassType); + clsType := elt as TPasClassType; + CheckNotNull(clsType.AncestorType,'AncestorType is null'); + CheckSame(tr.FindElementNS('TSimpleContentHeaderBlock',sXSD_NS),clsType.AncestorType,'AncestorType'); + finally + tr.Free(); + end; +end; + procedure TTest_CustomXsdParser.ComplexType_Class_default_values(); var tr : TwstPasTreeContainer; @@ -1388,6 +1450,16 @@ begin Result := ParseDoc('pascal_class_parent'); end; +function TTest_XsdParser.load_class_headerblock_derived_Schema() : TwstPasTreeContainer; +begin + Result := ParseDoc('class_headerblock_derived'); +end; + +function TTest_XsdParser.load_class_headerblock_simplecontent_derived_Schema() : TwstPasTreeContainer; +begin + Result := ParseDoc('class_headerblock_simplecontent_derived'); +end; + function TTest_XsdParser.LoadComplexType_Class_default_values() : TwstPasTreeContainer; begin Result := ParseDoc(x_complexType_class_default); @@ -1491,6 +1563,16 @@ begin Result := ParseDoc('pascal_class_parent'); end; +function TTest_WsdlParser.load_class_headerblock_derived_Schema( ) : TwstPasTreeContainer; +begin + Result := ParseDoc('class_headerblock_derived'); +end; + +function TTest_WsdlParser.load_class_headerblock_simplecontent_derived_Schema() : TwstPasTreeContainer; +begin + Result := ParseDoc('class_headerblock_simplecontent_derived'); +end; + procedure TTest_WsdlParser.no_binding_style(); var symTable : TwstPasTreeContainer; diff --git a/wst/trunk/tests/test_suite/test_soap_specific.pas b/wst/trunk/tests/test_suite/test_soap_specific.pas index ab8dae422..7bc5afa34 100644 --- a/wst/trunk/tests/test_suite/test_soap_specific.pas +++ b/wst/trunk/tests/test_suite/test_soap_specific.pas @@ -101,6 +101,20 @@ type property Prop_B : TNameSpaceB_Class read FProp_B write FProp_B; end; + TSampleSimpleContentHeaderBlock_A = class(TSimpleContentHeaderBlock) + public + class function GetNameSpace() : string; + end; + + { TSampleSimpleContentHeaderBlock_B } + + TSampleSimpleContentHeaderBlock_B = class(TSampleSimpleContentHeaderBlock_A) + private + FintAtt : Integer; + published + property intAtt : Integer read FintAtt write FintAtt; + end; + { TTest_SoapFormatterServerNameSpace } TTest_SoapFormatterServerNameSpace = class(TTestCase) @@ -111,9 +125,19 @@ type procedure multi_namespace_object_read(); end; + { TTest_SoapFormatterHeader } + + TTest_SoapFormatterHeader = class(TTestCase) + published + procedure write_header_simple_content_1(); + procedure write_header_simple_content_2(); + procedure read_header_simple_content_1(); + procedure read_header_simple_content_2(); + end; + implementation uses - object_serializer, server_service_soap, test_suite_utils; + object_serializer, server_service_soap, test_suite_utils, soap_formatter; function GetFileFullName(const AFileName: string): string; begin @@ -412,7 +436,188 @@ begin Result := 'NameSpace.C'; end; +{ TSampleSimpleContentHeaderBlock_A } + +class function TSampleSimpleContentHeaderBlock_A.GetNameSpace() : string; +begin + Result := 'urn:simple-content-header.sample'; +end; + +{ TTest_SoapFormatterHeader } + +procedure TTest_SoapFormatterHeader.write_header_simple_content_1(); +var + ser : IFormatterClient; + cc : ICallContext; + hdr : TSampleSimpleContentHeaderBlock_A; + locStream : TMemoryStream; + locDoc, locExistDoc : TXMLDocument; +begin + cc := TSimpleCallContext.Create(); + hdr := TSampleSimpleContentHeaderBlock_A.Create(); + cc.AddHeader(hdr,True); + hdr.Direction := hdOut; + hdr.Value := 'sample header simple content value'; + ser := soap_formatter.TSOAPFormatter.Create(); + ser.BeginCall('test_proc','TestService',cc); + ser.EndScope(); + locDoc := nil; + locExistDoc := nil; + locStream := TMemoryStream.Create(); + try + ser.SaveToStream(locStream); + locStream.SaveToFile(wstExpandLocalFileName('write_header_simple_content_1.xml')); + locStream.Position := 0; + ReadXMLFile(locDoc,locStream); + ReadXMLFile(locExistDoc,wstExpandLocalFileName(TestFilesPath + 'write_header_simple_content_1.xml')); + Check(CompareNodes(locExistDoc.DocumentElement,locDoc.DocumentElement),'generated document differs from the existent one.'); + finally + ReleaseDomNode(locDoc); + ReleaseDomNode(locExistDoc); + locStream.Free(); + end; +end; + +procedure TTest_SoapFormatterHeader.write_header_simple_content_2(); +var + ser : IFormatterClient; + cc : ICallContext; + hdrA : TSampleSimpleContentHeaderBlock_A; + hdrB : TSampleSimpleContentHeaderBlock_B; + locStream : TMemoryStream; + locDoc, locExistDoc : TXMLDocument; +begin + cc := TSimpleCallContext.Create(); + hdrA := TSampleSimpleContentHeaderBlock_A.Create(); + cc.AddHeader(hdrA,True); + hdrA.Direction := hdOut; + hdrA.Value := 'sample header simple content value'; + hdrB := TSampleSimpleContentHeaderBlock_B.Create(); + cc.AddHeader(hdrB,True); + hdrB.Direction := hdOut; + hdrB.Value := 'another content'; + hdrB.intAtt := 1210; + + ser := soap_formatter.TSOAPFormatter.Create(); + ser.BeginCall('test_proc','TestService',cc); + ser.EndScope(); + locDoc := nil; + locExistDoc := nil; + locStream := TMemoryStream.Create(); + try + ser.SaveToStream(locStream); + locStream.SaveToFile(wstExpandLocalFileName('write_header_simple_content_2.xml')); + locStream.Position := 0; + ReadXMLFile(locDoc,locStream); + ReadXMLFile(locExistDoc,wstExpandLocalFileName(TestFilesPath + 'write_header_simple_content_2.xml')); + Check(CompareNodes(locExistDoc.DocumentElement,locDoc.DocumentElement),'generated document differs from the existent one.'); + finally + ReleaseDomNode(locDoc); + ReleaseDomNode(locExistDoc); + locStream.Free(); + end; +end; + +procedure TTest_SoapFormatterHeader.read_header_simple_content_1(); +const + XML_SOURCE = + '' + sLineBreak + + '' + sLineBreak + + ' ' + sLineBreak + + ' sample header simple content value' + sLineBreak + + ' ' + sLineBreak + + ' ' + sLineBreak + + ' ' + sLineBreak + + ' ' + sLineBreak + + ''; +var + f : IFormatterClient; + strm : TMemoryStream; + strBuffer : ansistring; + cctx : ICallContext; + hdr : TSampleSimpleContentHeaderBlock_A; +begin + f := soap_formatter.TSOAPFormatter.Create() as IFormatterClient; + strm := TMemoryStream.Create(); + try + strBuffer := XML_SOURCE; + strm.Write(strBuffer[1],Length(strBuffer)); + strm.Position := 0; + f.LoadFromStream(strm); + cctx := TSimpleCallContext.Create() as ICallContext; + f.BeginCallRead(cctx); + CheckEquals(0,cctx.GetHeaderCount([hdOut]),'Ouput header count'); + CheckEquals(1,cctx.GetHeaderCount([hdIn]),'Input header count'); + CheckIs(cctx.GetHeader(0),TSampleSimpleContentHeaderBlock_A); + hdr := TSampleSimpleContentHeaderBlock_A(cctx.GetHeader(0)); + CheckEquals(1,hdr.mustUnderstand,'mustUnderstand'); + CheckEquals('sample header simple content value',hdr.Value,'Value'); + f.EndScopeRead(); + finally + FreeAndNil(strm); + end; +end; + +procedure TTest_SoapFormatterHeader.read_header_simple_content_2(); +const + XML_SOURCE = + '' + sLineBreak + + '' + sLineBreak + + ' ' + sLineBreak + + ' sample header simple content value' + sLineBreak + + ' another content' + sLineBreak + + ' ' + sLineBreak + + ' ' + sLineBreak + + ' ' + sLineBreak + + ' ' + sLineBreak + + ''; +var + f : IFormatterClient; + strm : TMemoryStream; + strBuffer : ansistring; + cctx : ICallContext; + hdrA : TSampleSimpleContentHeaderBlock_A; + hdrB : TSampleSimpleContentHeaderBlock_B; +begin + f := soap_formatter.TSOAPFormatter.Create() as IFormatterClient; + strm := TMemoryStream.Create(); + try + strBuffer := XML_SOURCE; + strm.Write(strBuffer[1],Length(strBuffer)); + strm.Position := 0; + f.LoadFromStream(strm); + cctx := TSimpleCallContext.Create() as ICallContext; + f.BeginCallRead(cctx); + CheckEquals(0,cctx.GetHeaderCount([hdOut]),'Ouput header count'); + CheckEquals(2,cctx.GetHeaderCount([hdIn]),'Input header count'); + CheckIs(cctx.GetHeader(0),TSampleSimpleContentHeaderBlock_A); + hdrA := TSampleSimpleContentHeaderBlock_A(cctx.GetHeader(0)); + CheckEquals(1,hdrA.mustUnderstand,'mustUnderstand'); + CheckEquals('sample header simple content value',hdrA.Value,'Value'); + CheckIs(cctx.GetHeader(1),TSampleSimpleContentHeaderBlock_B); + hdrB := TSampleSimpleContentHeaderBlock_B(cctx.GetHeader(1)); + CheckEquals(0,hdrB.mustUnderstand,'mustUnderstand'); + CheckEquals('another content',hdrB.Value,'Value'); + f.EndScopeRead(); + finally + FreeAndNil(strm); + end; +end; + initialization + + GetTypeRegistry().Register(TSampleSimpleContentHeaderBlock_A.GetNameSpace(),TypeInfo(TSampleSimpleContentHeaderBlock_A)); + TSampleSimpleContentHeaderBlock_B.RegisterAttributeProperty('intAtt'); + GetTypeRegistry().Register(TSampleSimpleContentHeaderBlock_B.GetNameSpace(),TypeInfo(TSampleSimpleContentHeaderBlock_B)); + GetTypeRegistry().Register(NBHeader.GetNameSpace(),TypeInfo(NBHeader),'NBHeader'); GetTypeRegistry().Register(TNameSpaceA_Class.GetNameSpace(),TypeInfo(TNameSpaceA_Class)); GetTypeRegistry().Register(TNameSpaceB_Class.GetNameSpace(),TypeInfo(TNameSpaceB_Class)); @@ -420,6 +625,7 @@ initialization GetTypeRegistry().Register(ns_soap_test,TypeInfo(TSOAPTestEnum)); RegisterTest('Serializer',TTest_SoapFormatterServerNameSpace.Suite); + RegisterTest('Serializer',TTest_SoapFormatterHeader.Suite); end. diff --git a/wst/trunk/tests/test_suite/wst_test_suite.lpr b/wst/trunk/tests/test_suite/wst_test_suite.lpr index a110eb36a..dd59871d9 100644 --- a/wst/trunk/tests/test_suite/wst_test_suite.lpr +++ b/wst/trunk/tests/test_suite/wst_test_suite.lpr @@ -19,7 +19,7 @@ uses xsd_consts, base_json_formatter, wsdl_parser, test_support, basex_encode, test_basex_encode, json_formatter, server_service_json, test_json, test_suite_utils, test_generators, test_std_cursors, test_rtti_filter, -test_wst_cursors, test_registry, test_generators_runtime; +test_wst_cursors, test_registry, test_soap_specific, test_generators_runtime; Const ShortOpts = 'alh';