diff --git a/wst/trunk/tests/test_suite/files/default_attribute_qualified.xsd b/wst/trunk/tests/test_suite/files/default_attribute_qualified.xsd new file mode 100644 index 000000000..a2b5d4efa --- /dev/null +++ b/wst/trunk/tests/test_suite/files/default_attribute_qualified.xsd @@ -0,0 +1,7 @@ + + diff --git a/wst/trunk/tests/test_suite/files/default_attribute_unqualified.xsd b/wst/trunk/tests/test_suite/files/default_attribute_unqualified.xsd new file mode 100644 index 000000000..c5184b0a2 --- /dev/null +++ b/wst/trunk/tests/test_suite/files/default_attribute_unqualified.xsd @@ -0,0 +1,7 @@ + + diff --git a/wst/trunk/tests/test_suite/files/default_element_qualified.xsd b/wst/trunk/tests/test_suite/files/default_element_qualified.xsd new file mode 100644 index 000000000..cc47b793d --- /dev/null +++ b/wst/trunk/tests/test_suite/files/default_element_qualified.xsd @@ -0,0 +1,7 @@ + + diff --git a/wst/trunk/tests/test_suite/files/default_element_unqualified.xsd b/wst/trunk/tests/test_suite/files/default_element_unqualified.xsd new file mode 100644 index 000000000..18ba650df --- /dev/null +++ b/wst/trunk/tests/test_suite/files/default_element_unqualified.xsd @@ -0,0 +1,7 @@ + + diff --git a/wst/trunk/tests/test_suite/test_generators.pas b/wst/trunk/tests/test_suite/test_generators.pas index a8daf393a..d63c8e5e1 100644 --- a/wst/trunk/tests/test_suite/test_generators.pas +++ b/wst/trunk/tests/test_suite/test_generators.pas @@ -54,6 +54,11 @@ type procedure type_alias_widestring(); procedure type_hint_array_item(); procedure type_hint_record_item(); + + procedure default_element_qualified(); + procedure default_element_unqualified(); + procedure default_attribute_qualified(); + procedure default_attribute_unqualified(); end; TTest_XsdGenerator = class(TTest_CustomXsdGenerator) @@ -1014,6 +1019,138 @@ begin end; end; +procedure TTest_CustomXsdGenerator.default_element_qualified(); +const MODULE_NAME = 'default_element_qualified'; +var + tr : TwstPasTreeContainer; + mdl : TPasModule; + g : IGenerator; + locDoc, locExistDoc : TXMLDocument; + fileName : string; +begin + locDoc := nil; + locExistDoc := nil; + tr := TwstPasTreeContainer.Create(); + try + CreateWstInterfaceSymbolTable(tr); + mdl := TPasModule(tr.CreateElement(TPasModule,MODULE_NAME,tr.Package,visDefault,'',0)); + tr.Package.Modules.Add(mdl); + mdl.InterfaceSection := TInterfaceSection(tr.CreateElement(TInterfaceSection,'',mdl,visDefault,'',0)); + tr.Properties.SetValue(mdl,s_elementFormDefault,s_qualified); + + locDoc := CreateDoc(); + g := CreateGenerator(locDoc); + g.Execute(tr,mdl.Name); + fileName := MODULE_NAME + '.xsd'; + //WriteXMLFile(locDoc,'.\'+fileName); + locExistDoc := LoadXmlFromFilesList(fileName); + 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.default_element_unqualified(); +const MODULE_NAME = 'default_element_unqualified'; +var + tr : TwstPasTreeContainer; + mdl : TPasModule; + g : IGenerator; + locDoc, locExistDoc : TXMLDocument; + fileName : string; +begin + locDoc := nil; + locExistDoc := nil; + tr := TwstPasTreeContainer.Create(); + try + CreateWstInterfaceSymbolTable(tr); + mdl := TPasModule(tr.CreateElement(TPasModule,MODULE_NAME,tr.Package,visDefault,'',0)); + tr.Package.Modules.Add(mdl); + mdl.InterfaceSection := TInterfaceSection(tr.CreateElement(TInterfaceSection,'',mdl,visDefault,'',0)); + tr.Properties.SetValue(mdl,s_elementFormDefault,s_unqualified); + + locDoc := CreateDoc(); + g := CreateGenerator(locDoc); + g.Execute(tr,mdl.Name); + fileName := MODULE_NAME + '.xsd'; + WriteXMLFile(locDoc,'.\'+fileName); + locExistDoc := LoadXmlFromFilesList(fileName); + 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.default_attribute_qualified(); +const MODULE_NAME = 'default_attribute_qualified'; +var + tr : TwstPasTreeContainer; + mdl : TPasModule; + g : IGenerator; + locDoc, locExistDoc : TXMLDocument; + fileName : string; +begin + locDoc := nil; + locExistDoc := nil; + tr := TwstPasTreeContainer.Create(); + try + CreateWstInterfaceSymbolTable(tr); + mdl := TPasModule(tr.CreateElement(TPasModule,MODULE_NAME,tr.Package,visDefault,'',0)); + tr.Package.Modules.Add(mdl); + mdl.InterfaceSection := TInterfaceSection(tr.CreateElement(TInterfaceSection,'',mdl,visDefault,'',0)); + tr.Properties.SetValue(mdl,s_attributeFormDefault,s_qualified); + + locDoc := CreateDoc(); + g := CreateGenerator(locDoc); + g.Execute(tr,mdl.Name); + fileName := MODULE_NAME + '.xsd'; + //WriteXMLFile(locDoc,'.\'+fileName); + locExistDoc := LoadXmlFromFilesList(fileName); + 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.default_attribute_unqualified(); +const MODULE_NAME = 'default_attribute_unqualified'; +var + tr : TwstPasTreeContainer; + mdl : TPasModule; + g : IGenerator; + locDoc, locExistDoc : TXMLDocument; + fileName : string; +begin + locDoc := nil; + locExistDoc := nil; + tr := TwstPasTreeContainer.Create(); + try + CreateWstInterfaceSymbolTable(tr); + mdl := TPasModule(tr.CreateElement(TPasModule,MODULE_NAME,tr.Package,visDefault,'',0)); + tr.Package.Modules.Add(mdl); + mdl.InterfaceSection := TInterfaceSection(tr.CreateElement(TInterfaceSection,'',mdl,visDefault,'',0)); + tr.Properties.SetValue(mdl,s_attributeFormDefault,s_unqualified); + + locDoc := CreateDoc(); + g := CreateGenerator(locDoc); + g.Execute(tr,mdl.Name); + fileName := MODULE_NAME + '.xsd'; + WriteXMLFile(locDoc,'.\'+fileName); + locExistDoc := LoadXmlFromFilesList(fileName); + 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; begin ReadXMLFile(Result,wstExpandLocalFileName(TestFilesPath + AFileName)); diff --git a/wst/trunk/ws_helper/xsd_generator.pas b/wst/trunk/ws_helper/xsd_generator.pas index d793216ce..65247c377 100644 --- a/wst/trunk/ws_helper/xsd_generator.pas +++ b/wst/trunk/ws_helper/xsd_generator.pas @@ -117,6 +117,10 @@ type ASymTable : TwstPasTreeContainer; AModule : TPasModule );virtual; + procedure GenerateModuleOptions( + ASymTable : TwstPasTreeContainer; + AModule : TPasModule + );virtual; property Document : TDOMDocument read FDocument; property Options : TGeneratorOptions read FOptions; public @@ -1373,6 +1377,7 @@ begin raise EXsdGeneratorException.CreateFmt('Unable to find module : "%s".',[AModuleName]); Prepare(ASymTable,mdl); GenerateImports(ASymTable,mdl); + GenerateModuleOptions(ASymTable,mdl); gr := GetXsdTypeHandlerRegistry(); typeList := mdl.InterfaceSection.Declarations; k := typeList.Count; @@ -1419,6 +1424,30 @@ begin end; +procedure TCustomXsdGenerator.GenerateModuleOptions( + ASymTable : TwstPasTreeContainer; + AModule : TPasModule +); +var + s : string; + locSchemaNode : TDOMElement; +begin + if ASymTable.Properties.HasValue(AModule,s_elementFormDefault) then begin + s := Trim(ASymTable.Properties.GetValue(AModule,s_elementFormDefault)); + if (s <> '') then begin + locSchemaNode := GetSchemaNode(FDocument) as TDOMElement; + locSchemaNode.SetAttribute(s_elementFormDefault,s); + end; + end; + if ASymTable.Properties.HasValue(AModule,s_attributeFormDefault) then begin + s := Trim(ASymTable.Properties.GetValue(AModule,s_attributeFormDefault)); + if (s <> '') then begin + locSchemaNode := GetSchemaNode(FDocument) as TDOMElement; + locSchemaNode.SetAttribute(s_attributeFormDefault,s); + end; + end; +end; + constructor TCustomXsdGenerator.Create(const ADocument : TDOMDocument); begin Create(ADocument,[]);