%%%-------------------------------------------------------------------
%%% File : test2.erl
%%% Author : Bertil Karlsson <bertil@finrod>
%%% Description :
%%%
%%% Created : 26 Sep 2006 by Bertil Karlsson <bertil@finrod>
%%%-------------------------------------------------------------------
-module(gen_testsuits-2001-01-16).
-compile(export_all).
-include_lib("xmerl/include/xmerl.hrl").
%% generate(Suite) generates test suite modules. In those modules are
%% all test cases extracted from the corresponding ".testSet"
%% file. This program must be in the xmlSchema2002-01-16 directory of
%% the unpacked xmlSchema2002-01-16.tar file. The test suite files are
%% created in this directory.
generate(all) ->
generate(nist),
generate(sun),
generate(msx);
generate(nist) ->
io:format("generating test suite source ~p~n",
["NISTXMLSchema1-0-20020116.testSet"]),
generate("NISTXMLSchema1-0-20020116.testSet"),
io:format("compiling test suite source~n",[]),
{ok,_}=compile:file("xmerl_xsd_NIST2002-01-16_SUITE.erl",[{i,"/view/bertil_xmerl/clearcase/otp/erts/lib/test_server/include/"},{i,"/view/bertil_xmerl/clearcase/otp/erts/lib/xmerl/include/"}]);
generate(sun) ->
io:format("generating test suite source ~p~n",
["SunXMLSchema1-0-20020116.testSet"]),
generate("SunXMLSchema1-0-20020116.testSet"),
io:format("compiling test suite source~n",[]),
{ok,_}=compile:file("xmerl_xsd_Sun2002-01-16_SUITE.erl",[{i,"/view/bertil_xmerl/clearcase/otp/erts/lib/test_server/include/"},{i,"/view/bertil_xmerl/clearcase/otp/erts/lib/xmerl/include/"}]);
generate(msx) ->
io:format("generating test suite source ~p~n",
["MSXMLSchema1-0-20020116.testSet"]),
generate("MSXMLSchema1-0-20020116.testSet"),
io:format("compiling test suite source~n",[]),
{ok,_}=compile:file("xmerl_xsd_MS2002-01-16_SUITE.erl",[{i,"/view/bertil_xmerl/clearcase/otp/erts/lib/test_server/include/"},{i,"/view/bertil_xmerl/clearcase/otp/erts/lib/xmerl/include/"}]);
generate(Suite) ->
{E,_} = xmerl_scan:file(Suite),
{ok,FileName} = create_suite_name(xmerl_xpath:string("./@name",E)),
case create_suite_file(FileName) of
{ok,IO} ->
emit_licens_text(IO),
emit_module_header(IO,list_to_atom(filename:rootname(FileName))),
generate2(abbrev(Suite),E,IO);
_ ->
failed
end.
generate2(Suite,E,IO) ->
%% Each testGroup name is a function in the test suite.
TestGroupNames = test_case_names(Suite),
emit_all_function(TestGroupNames,IO),
emit_init_per_suite(IO,Suite),
emit_init_per_testcase(IO),
TestGroups=[X||X=#xmlElement{}<-E#xmlElement.content],
TestGroupGroups = group_testGroups(test_case_prefix(Suite),TestGroups),
generate_test_case_functions(Suite,TestGroupGroups,IO).
group_testGroups(Prefs,TGs) ->
group_testGroups(Prefs,TGs,[]).
group_testGroups([],[],Acc) ->
lists:reverse(Acc);
group_testGroups(Prefs,TGs,Acc) ->
SplitPrefs = fun([{_,[]}|T],F) ->
F(T,F);
([{N,[H|T1]}|T2],_) ->
{H,N,[{N,T1}|T2]};
([H|T],_) ->
{H,H,T};
(A,B) ->
io:format("SplitRefs: ~nA: ~p~nB: ~p~nTGs: ~p~n",[A,B,hd(TGs)]),
exit(dummy)
end,
{Pref,TCName,Prefs2} = SplitPrefs(Prefs,SplitPrefs),
Pred =
fun(E) ->
case xmerl_xpath:string("@name",E) of
[#xmlAttribute{value=V}] ->
lists:prefix(Pref,V);
_ -> false
end
end,
{TGG,TGs2}=lists:splitwith(Pred,TGs),
%% case TGG of
%% [] ->
%% io:format("hd(Prefs): ~p~n",[hd(Prefs)]);
%% _ ->
%% ok
%% end,
group_testGroups(Prefs2,TGs2,acc_group({TCName,TGG},Acc)).
acc_group({Name,TGG},[{Name,AccP}|Acc]) ->
[{Name,AccP++TGG}|Acc];
acc_group(TGG,Acc) ->
[TGG|Acc].
generate_test_case_functions(_Suite,[],IO) ->
%%emit_schema_test(IO),
%%emit_instance_test(IO),
file:close(IO);
generate_test_case_functions(Suite,[{TCName,TGG}|TGGs],IO) ->
emit_test_case_func(true,TCName,comment(TCName,TGG),IO),
generate_test_cases(Suite,TGG,0,0,IO),
generate_test_case_functions(Suite,TGGs,IO).
generate_test_cases(_,[],SIndex,EIndex,IO) ->
emit_result_list_test(IO,SIndex,EIndex),
%% emit_schema_result_list(IO,SIndex,EIndex),
%% emit_instance_result_list(IO,SIndex,EIndex),
ok;
generate_test_cases(Suite,[El|Els],SIndex,EIndex,IO) ->
SchemaTest = xmerl_xpath:string("schemaTest",El),
InstanceTest = xmerl_xpath:string("instanceTest",El),
SIndex2 = generate_schema_tests(Suite,SchemaTest,IO,SIndex,
any_instance_tests(InstanceTest)),
EIndex2=generate_instance_tests(InstanceTest,mk_state(SIndex),EIndex,IO),
case {Els,any_tests(SchemaTest,InstanceTest)} of
%% {[],true} ->
%% emit(IO,[".",nl]);
%% {_,true} ->
%% emit(IO,[",",nl]);
_ ->
ok
end,
emit(IO,[nl,nl]),
generate_test_cases(Suite,Els,SIndex2,EIndex2,IO).
%% 0 or 1 schemaTest/ testGroup, but a schemaTest may reference many schemas
generate_schema_tests(_Suite,[],_IO,SIndex,_) ->
SIndex;
generate_schema_tests(Suite,[SchemaTest],IO,SIndex,AnyInstanceTests) ->
case xmerl_xpath:string("current[@status=\"accepted\" or @status=\"stable\"]",SchemaTest) of
[] ->
SIndex;
_ ->
case exclude_case(Suite,xmerl_xpath:string("@name",SchemaTest)) of
true ->
SIndex;
_ ->
Refs = xmerl_xpath:string("schemaDocument/@xlink:href",
SchemaTest),
ExpectedValue = xmerl_xpath:string("expected/@validity",
SchemaTest),
ExpectedReturnValue =
expected_return_value_st(ExpectedValue,SIndex),
generate_schema_validation_call(ExpectedReturnValue,
Refs,0,SIndex,
IO,length(Refs)>1,
AnyInstanceTests)
end
end.
generate_schema_validation_call(_RetVal,[],_Num,Sindex,_IO,_,false) ->
%% emit(IO,[RetVal]),
%% emit(IO,[".",nl]),
Sindex;
generate_schema_validation_call(_RetVal,[],_Num,Sindex,_IO,_,true) ->
%% emit(IO,[RetVal]),
% emit(IO,[",",nl]),
Sindex;
generate_schema_validation_call(RetVal,[#xmlAttribute{value=Link}|Refs],
Num,Sindex,IO,ManySchemas,AnyInstanceTests) ->
XsdBase = filename:dirname(Link),
%% FileName = lists:flatten(io_lib:format("filename:join([?config(data_dir,Config), ~p])", [list_to_atom(Link)])),
AccState =
case Num of
0 ->
"";
_ ->
",{state," ++ mk_state(Sindex - 1) ++ "}"
end,
if
Sindex == 0 ->
emit(IO,[indent(2),mk_STResList(0)," = [],",nl,nl]);
true ->
ok
end,
RetState =
if
ManySchemas;AnyInstanceTests ->
mk_state(Sindex);
true ->
"_"
end,
%% emit(IO,[indent(2),"?line ",mk_state(Num)," = xmerl_xsd:process_schema(",nl,
%% indent(25),FileName,",",nl,
%% indent(25),"[{xsdbase,filename:join([?config(data_dir,Config),'",
%% XsdBase,"'])}",AccState,"]),",nl]),
emit(IO,[indent(2),"?line {",mk_STRes(Sindex),",",RetState,
"} = xmerl_xsd_lib:schema_test(Config,",
list_to_atom(Link),",",list_to_atom(XsdBase),",",RetVal,AccState,"),",nl]),
emit(IO,[indent(2),mk_STResList(Sindex+1)," = [",mk_STRes(Sindex),"|",
mk_STResList(Sindex),"],",nl]),
generate_schema_validation_call(RetVal,Refs,Num+1,Sindex+1,IO,
ManySchemas,AnyInstanceTests).
%% 0 or many instanceTests / testGroup
generate_instance_tests([],_,EI,_IO) ->
EI;
generate_instance_tests([InstanceTest|ITs],State,Num,IO) ->
case xmerl_xpath:string("current[@status=\"accepted\" or @status=\"stable\"]",InstanceTest) of
[] ->
ok;
_ ->
if
Num == 0 ->
emit(IO,[indent(2),mk_ITResList(0)," = [],",nl]);
true ->
ok
end,
[Ref] = xmerl_xpath:string("instanceDocument/@xlink:href",InstanceTest),
ExpectedValue = xmerl_xpath:string("expected/@validity",
InstanceTest),
ExpectedReturnValue = expected_return_value_it(ExpectedValue),
generate_instance_validation_call(ExpectedReturnValue,Ref,
State,Num,IO)
end,
case ITs of
[] -> ok; %%emit(IO,[".",nl]);
_ ->ok% emit(IO,[",",nl])
end,
generate_instance_tests(ITs,State,Num+1,IO).
generate_instance_validation_call(ExpectedReturnValue,
#xmlAttribute{value=Link},State,Num,IO) ->
XMLBase = filename:dirname(Link),
%%FileName = filename:basename(Link),
%% FileName = lists:flatten(io_lib:format("filename:join([?config(data_dir,Config), ~p])", [list_to_atom(Link)])),
%% E = mk_E(Num),
Res = mk_ITRes(Num),
%% emit(IO,[indent(2),"?line {",E,",_} = xmerl_scan:file(",FileName,",",nl,
%% indent(32),"[{xmlbase,filename:join([?config(data_dir,Config),'",
%% XMLBase,"'])}]),",nl]),
emit(IO,[indent(2),"?line ",Res," = xmerl_xsd_lib:instance_test(Config,",list_to_atom(Link),",",list_to_atom(XMLBase),",",ExpectedReturnValue,",",State,"),",nl]),
emit(IO,[indent(2),mk_ITResList(Num+1)," = [",Res,"|",mk_ITResList(Num),"],",nl]).
%% emit(IO,[indent(2),"?line ",ExpectedReturnValue,
%% " = xmerl_xsd:validate(",E,",[{state,",State,"}])"]).
any_tests([],[]) ->
false;
any_tests(_,_) ->
true.
any_instance_tests([]) ->
false;
any_instance_tests(_) ->
true.
expected_return_value_it([#xmlAttribute{value=Validity}]) ->
case Validity of
"valid" ->
valid;
"invalid" ->
invalid;
_ ->
notKnown
end;
expected_return_value_it([]) ->
"_".
expected_return_value_st([#xmlAttribute{value=Validity}],_Num) ->
%% RetVal =
case Validity of
%% "valid" -> "#xsd_state{errors=[]}";
%% "invalid" -> "#xsd_state{errors=[_Err|_Errs]}";
%% _ -> "#xsd_state{}"
%% end,
%% " ?line " ++ RetVal ++ " = " ++ mk_state(Num).
"valid" ->
valid;
"invalid" ->
invalid;
_ ->
notKnown
end.
create_suite_name([#xmlAttribute{value=Name}]) ->
FileName = lists:concat(['xmerl_','xsd_',Name,'_SUITE.erl']),
{ok,FileName};
create_suite_name(_) ->
error.
create_suite_file(FileName) ->
file:delete(FileName),
case file:open(FileName,[append]) of
{ok,IO} -> {ok,IO};
_ -> failed
end.
emit_licens_text(IO) ->
emit(IO,[
"%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2006-2010. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved online at http://www.erlang.org/.
%%
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
%%
%% %CopyrightEnd%
%%",nl,
"%%",nl,
"%%% Purpose : Test suite for the xmerl application",nl,nl,
"%% Do NOT edit this file. It is generated by the generate_xsd_suite module",nl,"%% For more info read the comments in the header of that file.",nl,nl]).
emit_module_header(IO,Module) ->
emit(IO,["-module(",{asis,Module},").",nl,nl]),
emit(IO,["-compile(export_all).",nl,nl]),
emit(IO,["-include(",{asis,"test_server.hrl"},").",nl]),
emit(IO,["-include_lib(",{asis,"xmerl/include/xmerl.hrl"},").",nl]),
emit(IO,["-include_lib(",{asis,"xmerl/include/xmerl_xsd.hrl"},").",nl,nl,nl]).
emit_all_function(TestGroupNames,IO) ->
emit(IO,["all(suite) -> [",nl]),
emit(IO,[list_to_atom(X)||X<-indent_all(TestGroupNames)]),
emit(IO,["].",nl,nl,nl]).
emit_init_per_suite(IO,Suite) ->
emit(IO,["%% initialization before the test suite",nl]),
emit(IO,["init_per_suite(Config) ->",nl,
" Dog=test_server:timetrap({minutes,10}),",nl,
" xmerl_xsd_lib:unpack(Config,",Suite,"),",nl,
" {ok,LogFile} = xmerl_xsd_lib:create_error_log_file(Config,",Suite,"),",nl,
" test_server:timetrap_cancel(Dog),",nl,
" [{suite,",Suite,"},{xmerl_error_log,LogFile}|Config].",nl,nl]),
emit(IO,["end_per_suite(Config) ->",nl,
" xmerl_xsd_lib:rmdir(Config,",Suite,"),",nl,
" xmerl_xsd_lib:close_error_log_file(Config),",nl,
" ok.",nl,nl]).
emit_init_per_testcase(IO) ->
emit(IO,["%% initialization before each testcase",nl]),
emit(IO,["init_per_testcase(TestCase,Config) ->",nl,
indent(2),"Dog=test_server:timetrap({minutes,3}),",nl,
indent(2),"[{testcase,TestCase},{watchdog, Dog}|Config].",nl,nl]),
emit(IO,["%% clean up after each testcase",nl,
"end_per_testcase(_Func,Config) ->",nl,
indent(2),"Dog=?config(watchdog, Config),",nl,
indent(2),"test_server:timetrap_cancel(Dog),",nl,
indent(2),"ok.",nl,nl]).
emit_test_case_func(false,TestCaseName,_Doc,IO) ->
emit(IO,["%% skipped testcase ",{asis,TestCaseName},".",nl,
"%% There were no schemaTest case or instanceTest case.",nl,nl]);
emit_test_case_func(true,TestCaseName,Doc,IO) ->
%% emit(IO,indent_comment(Doc)),
emit(IO,Doc),
emit(IO,[nl,{asis,list_to_atom(TestCaseName)},"(Config) when is_list(Config) ->",nl]).
emit_result_list_test(IO,0,0) ->
emit(IO,[" xmerl_xsd_lib:compare_test_results(Config,[],[]).",nl,nl]);
emit_result_list_test(IO,STI,0) ->
emit(IO,[" xmerl_xsd_lib:compare_test_results(Config,",mk_STResList(STI),
",[]).",nl,nl]);
emit_result_list_test(IO,0,ITI) ->
emit(IO,[" xmerl_xsd_lib:compare_test_results(Config,[],",mk_ITResList(ITI),
").",nl,nl]);
emit_result_list_test(IO,STI,ITI) ->
emit(IO,[" xmerl_xsd_lib:compare_test_results(Config,",mk_STResList(STI),
",",mk_ITResList(ITI),").",nl,nl]).
emit_schema_result_list(_IO,0,_) ->
ok;
emit_schema_result_list(IO,SIndex,0) ->
emit(IO,[indent(2),"STResults = lists:reverse(",mk_STResList(SIndex),"),",nl]);
emit_schema_result_list(IO,SIndex,_) ->
emit(IO,[indent(2),"STResults = lists:reverse(",mk_STResList(SIndex),"),",nl]).
emit_instance_result_list(_IO,0,0) ->
ok;
emit_instance_result_list(IO,_,0) ->
emit(IO,[indent(2),"xmerl_xsd_lib:compare_test_results(Config,STResults,[])).",nl]);
emit_instance_result_list(IO,0,I) ->
emit(IO,[indent(2),"xmerl_xsd_lib:compare_test_results(Config,[],lists:reverse(",mk_ITResList(I),")).",nl]);
emit_instance_result_list(IO,_,I) ->
%% emit(IO,indent_all(res_list(0,I))).
%% emit(IO,["ITResults =",nl,"["]++res_list(0,I-1,fun mk_ITRes/1)++["].",nl]).
emit(IO,[indent(2),"xmerl_xsd_lib:compare_test_results(Config,STResults,lists:reverse(",mk_ITResList(I),")).",nl]).
emit(IO,[nl|T]) ->
io:format(IO,"~n",[]),
emit(IO,T);
emit(IO,[comma|T]) ->
io:format(IO,",",[]),
emit(IO,T);
emit(IO,[H|T]) ->
print(IO,H),
emit(IO,T);
emit(_,[]) ->
ok.
print(IO,Str) when is_list(Str) ->
io:format(IO,"~s",[Str]);
print(IO,{asis,Sym}) ->
io:format(IO,"~p",[Sym]);
print(IO,Term) ->
io:format(IO,"~p",[Term]).
mk_state(I) ->
mk_VarNum("S",I).
mk_E(Num) ->
mk_VarNum("E",Num).
mk_VarNum(Var,Num) ->
lists:concat([Var,Num]).
mk_ITRes(Num) ->
mk_VarNum("ITRes",Num).
mk_STRes(Num) ->
mk_VarNum("STRes",Num).
mk_STResList(Num) ->
mk_VarNum("STResList",Num).
mk_ITResList(Num) ->
mk_VarNum("ITResList",Num).
res_list(N,N,VariableFun) ->
[VariableFun(N)];
res_list(M,N,VariableFun) ->
[VariableFun(M),comma|res_list(M+1,N,VariableFun)].
indent(I) ->
lists:flatten(lists:duplicate(I," ")).
indent_all([H|T]) ->
indent_all(T,length(H),[H]).
indent_all([],_Col,Acc) ->
lists:reverse(Acc);
indent_all([H|T],Col,Acc) when is_list(H) ->
case length(H)+Col of
I when I < 80 ->
indent_all(T,I+1,[H,"comma"|Acc]);
_I ->
indent_all(T,length(H),[H,"nl","comma"|Acc])
end.
indent_comment(Comment) ->
indent_comment(string:tokens(Comment,"\n\t\s"),3,["%% "]).
indent_comment([],_,Acc) ->
lists:reverse(Acc);
indent_comment([H|T],Col,Acc) ->
case length(H) + Col of
I when I > 80 ->
indent_comment(T,length(H) + 3,[H,"%% ",nl|Acc]);
I ->
indent_comment(T,I + 1,[H," "|Acc])
end.
test_case_names(nist) ->
[X||X<-test_case_prefix(nist)];
test_case_names(msx) ->
[X||X<-lists:map(fun({N,_})->N;(N)when is_list(N) -> N end,test_case_prefix(msx))];
test_case_names(sun) ->
test_case_prefix(sun).
abbrev("NISTXMLSchema1-0-20020116.testSet") ->
nist;
abbrev("MSXMLSchema1-0-20020116.testSet") ->
msx;
abbrev(_) ->
sun.
test_case_prefix(msx) ->
["att","ct","elem","group","idc_","id",
{"mgABCD",["mgA","mgB","mgC","mgD"]},
{"mgEFG",["mgE","mgF","mgG"]},{"mgHIJ",["mgH","mgI","mgJ"]},
"mgK",{"mgLM",["mgL","mgM"]},"mgN",{"mgOP",["mgO","mgP"]},
{"mgQR",["mgQ","mgR"]},"mgS",
{"particlesAB",["particlesA","particlesB"]},
{"particlesCDE",["particlesC","particlesD","particlesE"]},
{"particlesFHI",["particlesF","particlesH","particlesI"]},
"particlesJ",
{"particlesKOSRTQUVW",
["particlesK","particlesO","particlesS","particlesR","particlesT",
"particlesQ","particlesU","particlesV","particlesW"]},
{"stABCDE",["stA","stB","stC","stD","stE"]},
{"stFGH",["stF","stG","stH"]},{"stIJK",["stI","stJ","stK"]},
"stZ",{"wildABCDEF",["wildA","wildB","wildC","wildD","wildE","wildF"]},
{"wildGHI",["wildG","wildH","wildI"]},
{"wildJKLMNQOP",["wildJ","wildK","wildL","wildM","wildN",
"wildQ","wildO","wildP"]},"wildZ"];
test_case_prefix(nist) ->
["NISTSchema-anyURI","NISTSchema-base64Binary","NISTSchema-boolean",
"NISTSchema-byte","NISTSchema-date-","NISTSchema-dateTime",
"NISTSchema-decimal","NISTSchema-double","NISTSchema-duration",
"NISTSchema-float","NISTSchema-gDay","NISTSchema-gMonth-",
"NISTSchema-gMonthDay","NISTSchema-gYear-","NISTSchema-gYearMonth",
"NISTSchema-hexBinary","NISTSchema-ID","NISTSchema-int-",
"NISTSchema-integer","NISTSchema-language","NISTSchema-long",
"NISTSchema-Name","NISTSchema-NCName","NISTSchema-negativeInteger",
"NISTSchema-NMTOKEN","NISTSchema-nonNegativeInteger",
"NISTSchema-nonPositiveInteger","NISTSchema-normalizedString",
"NISTSchema-positiveInteger","NISTSchema-QName","NISTSchema-short",
"NISTSchema-string","NISTSchema-time","NISTSchema-token",
"NISTSchema-unsignedByte","NISTSchema-unsignedInt",
"NISTSchema-unsignedLong","NISTSchema-unsignedShort"];
test_case_prefix(sun) ->
["Sun-idc001.nogen", "Sun-idc002.e", "Sun-idc002b.e", "Sun-idc003.e",
"Sun-idc004.nogen", "Sun-idc004a.e", "Sun-idc005.nogen",
"Sun-idc006.nogen", "Sun-xsd001", "Sun-xsd002", "Sun-xsd003-1.e",
"Sun-xsd003-2.e", "Sun-xsd003a", "Sun-xsd003b", "Sun-xsd004",
"Sun-xsd005", "Sun-xsd006", "Sun-xsd008", "Sun-xsd011", "Sun-xsd012",
"Sun-xsd013.e", "Sun-xsd014.e", "Sun-xsd015.e", "Sun-xsd016.e",
"Sun-xsd017.e", "Sun-xsd018.e", "Sun-xsd019.e", "Sun-xsd020.e",
"Sun-xsd020-2.e", "Sun-xsd020-3.e", "Sun-xsd020-4.e", "Sun-xsd021",
"Sun-xsd022", "Sun-xsd023.e", "Sun-xsiType1", "Sun-xsiType-block-1",
"Sun-xsiType-block-2", "Sun-xsiType-block-3", "Sun-xsiType-block-4",
"Sun-type-and-subst-1"].
comment([$S,$u,$n|_],[TG]) ->
case xmerl_xpath:string("annotation/documentation/text()",TG) of
L=[#xmlText{}|_] ->
["%% "|[X||#xmlText{value=X}<-L]];
_ ->
["%%"]
end;
comment("att",_) ->
["%% Syntax Checking for Attribute Declaration",nl];
comment("ct",_) ->
["%% Syntax Checking for top level complexType Declaration.",nl,
"%% Syntax Checking for simpleContent complexType Declaration.",nl,
"%% Syntax Checking for comlexContent complexType Declaration",nl,
"%% complexType Validation checking",nl,
"%% complexType Schema Component Constraints",nl];
comment("elem",_) ->
["%% 3.3.2 XML Representation of Element Declaration.",nl,
"%% 3.3.4 Element Declaration Validation Rules.",nl,
"%% element Validation checking.",nl,
"%% Regular Expression Validation checking.",nl,
"%% Bug Regressions Specs section: 3.3.4",nl];
comment("group",_) ->
["%% Syntax Checking Model Group Tests.",nl,
"%% Content Checking Model Group Tests.",nl];
comment("idc_",_) ->
["%% 3.11.1 The Identity-constraint Definition Schema Component.",nl];
comment("id",_) ->
["%% Identity-constraint Definition Schema Component.",nl,
"%% Identity-constraint Validation Rules.",nl,
"%% Selector identity-constraint xpath bnf.",nl,
"%% Field identity-constraint xpath bnf.",nl,
"%% XPath validation.",nl,
"%% Bug Regressions",nl];
comment("mgABCD",_) ->
["%% model groups (ALL).",nl];
comment("mgEFG",_) ->
["%% model groups ( sequence ).",nl];
comment("mgHIJ",_) ->
["%% model groups ( choice ).",nl];
comment("mgK",_) ->
["%% model group validation checking (sequence).",nl];
comment("mgLM",_) ->
["%% model group validation checking (choice, all).",nl];
comment("mgN",_) ->
["%% Element Sequence Valid.",nl];
comment("mgOP",_) ->
["%% All Group Limited.",nl];
comment("mgQR",_) ->
["%% Element Declarations Consistent, 3.8.6",nl];
comment("mgS",_) ->
["%% Deterministic Sequences.",nl];
comment("particlesAB",_) ->
["%% 3.9.1 The Particle Schema Component.",nl];
comment("particlesCDE",_) ->
["%% 3.9.4 Particle Validation Rules: Element Sequence Locally Valid.",nl];
comment("particlesFHI",_) ->
["%% 3.9.6 Schema Component Constraint: Particle ....",nl];
comment("particlesJ",_) ->
["%% 3.9.6 Particle Derivation.",nl];
comment("particlesKOSRTQUVW",_) ->
["%% 3.9.6 Particle Restriction.",nl];
comment("stABCDE",_) ->
["%% Syntax Checking for simpleType Declaration.",nl];
comment("stFGH",_) ->
["%% simpleType Validation checking.",nl];
comment("stIJK",_) ->
["%% simpleType Schema Component Constraints.",nl];
comment("stZ",_) ->
["%% Bug Regressions.",nl];
comment("wildABCDEF",_) ->
["%% Syntax Validation - any.",nl];
comment("wildGHI",_) ->
["%% 3.10.4 Wildcard Validation Rules - any.",nl];
comment("wildJKLMNQOP",_) ->
["%% Syntax Validation - anyAttribute.",nl];
comment("wildZ",_) ->
["%% Bugs - Wildcards.",nl];
comment("NISTSchema-anyURI",_) ->
["%% Data type derived by restriction of anyURI by facets",nl];
comment("NISTSchema-base64Binary",_) ->
["%% Data type derived by restriction of base64binary by facets",nl];
comment("NISTSchema-boolean",_) ->
["%% Data type derived by restriction of boolean by facets",nl];
comment("NISTSchema-byte",_) ->
["%% Data type derived by restriction of byte by facets",nl];
comment("NISTSchema-date-",_) ->
["%% Data type derived by restriction of date by facets",nl];
comment("NISTSchema-dateTime",_) ->
["%% Data type derived by restriction of dateTime by facets",nl];
comment("NISTSchema-decimal",_) ->
["%% Data type derived by restriction of decimal by facets",nl];
comment("NISTSchema-double",_) ->
["%% Data type derived by restriction of double by facets",nl];
comment("NISTSchema-duration",_) ->
["%% Data type derived by restriction of duration by facets",nl];
comment("NISTSchema-float",_) ->
["%% Data type derived by restriction of float by facets",nl];
comment("NISTSchema-gDay",_) ->
["%% Data type derived by restriction of gDay by facets",nl];
comment("NISTSchema-gMonth-",_) ->
["%% Data type derived by restriction of gMonth by facets",nl];
comment("NISTSchema-gMonthDay",_) ->
["%% Data type derived by restriction of gMonthDay by facets",nl];
comment("NISTSchema-gYear-",_) ->
["%% Data type derived by restriction of gYear by facets",nl];
comment("NISTSchema-gYearMonth",_) ->
["%% Data type derived by restriction of gYearMonth by facets",nl];
comment("NISTSchema-hexBinary",_) ->
["%% Data type derived by restriction of hexBinary by facets",nl];
comment("NISTSchema-ID",_) ->
["%% Data type derived by restriction of ID by facets",nl];
comment("NISTSchema-int-",_) ->
["%% Data type derived by restriction of int by facets",nl];
comment("NISTSchema-integer",_) ->
["%% Data type derived by restriction of integer by facets",nl];
comment("NISTSchema-language",_) ->
["%% Data type derived by restriction of language by facets",nl];
comment("NISTSchema-long",_) ->
["%% Data type derived by restriction of long by facets",nl];
comment("NISTSchema-Name",_) ->
["%% Data type derived by restriction of Name by facets",nl];
comment("NISTSchema-NCName",_) ->
["%% Data type derived by restriction of NCName by facets",nl];
comment("NISTSchema-negativeInteger",_) ->
["%% Data type derived by restriction of negativeInteger by facets",nl];
comment("NISTSchema-NMTOKEN",_) ->
["%% Data type derived by restriction of NMTOKEN by facets",nl];
comment("NISTSchema-nonNegativeInteger",_) ->
["%% Data type derived by restriction of nonNegativeInteger by facets",nl];
comment("NISTSchema-nonPositiveInteger",_) ->
["%% Data type derived by restriction of nonPositiveInteger by facets",nl];
comment("NISTSchema-normalizedString",_) ->
["%% Data type derived by restriction of normalizedString by facets",nl];
comment("NISTSchema-positiveInteger",_) ->
["%% Data type derived by restriction of positiveInteger by facets",nl];
comment("NISTSchema-QName",_) ->
["%% Data type derived by restriction of QName by facets",nl];
comment("NISTSchema-short",_) ->
["%% Data type derived by restriction of short by facets",nl];
comment("NISTSchema-string",_) ->
["%% Data type derived by restriction of string by facets",nl];
comment("NISTSchema-time",_) ->
["%% Data type derived by restriction of time by facets",nl];
comment("NISTSchema-token",_) ->
["%% Data type derived by restriction of token by facets",nl];
comment("NISTSchema-unsignedByte",_) ->
["%% Data type derived by restriction of unsignedByte by facets",nl];
comment("NISTSchema-unsignedInt",_) ->
["%% Data type derived by restriction of unsignedInt by facets",nl];
comment("NISTSchema-unsignedLong",_) ->
["%% Data type derived by restriction of unsignedLong by facets",nl];
comment("NISTSchema-unsignedShort",_) ->
["%% Data type derived by restriction of unsignedShort by facets",nl].
emit_schema_test(IO) ->
emit(IO,["schema_test(Config,FileName,XsdBase,Validity) ->",nl,
indent(3),"{Ok,S} = xmerl_xsd:process_schema(",
"filename:join([?config(data_dir,Config),FileName]),",nl,
indent(25),
"[{xsdbase,filename:join([?config(data_dir,Config),XsdBase])}]),",nl,
indent(3),"case Validity of",nl,
indent(6),valid ," when Ok == ok ->",nl,
indent(9),"{{filename:basename(FileName),S#xsd_state.errors == []},S};", nl,
indent(6),invalid," when Ok == error ->",nl,
indent(9), "{{filename:basename(FileName),true},S};",nl,
indent(6),notKnown," ->",nl,
indent(9),"{{filename:basename(FileName),true},S};",nl,
indent(6),"_ -> {{filename:basename(FileName),false},S}",nl,
indent(3),"end.",nl]),
emit(IO,["schema_test(Config,FileName,XsdBase,Validity,AccState) ->",nl,
indent(3),"{Ok,S2} = xmerl_xsd:process_schema(",
"filename:join([?config(data_dir,Config),FileName]),",nl,
indent(25),
"[{xsdbase,filename:join([?config(data_dir,Config),XsdBase])}, AccState]),",nl,
indent(3),"case Validity of",nl,
indent(6),valid," when Ok == ok ->",nl,
indent(9),"{{filename:basename(FileName),S2#xsd_state.errors == []},S2};", nl,
indent(6),invalid," when Ok == error ->",nl,
indent(9), "{{filename:basename(FileName),true},S2};",nl,
indent(6),notKnown," ->",nl,
indent(9),"{{filename:basename(FileName),true},S2};",nl,
indent(6),"_ -> {{filename:basename(FileName),false},S2}",nl,
indent(3),"end.",nl]).
emit_instance_test(IO) ->
emit(IO,["instance_test(Config,FileName,XMLBase,Validity,State) ->",nl]),
emit(IO,[indent(3),"{E,_} = xmerl_scan:file(filename:join([?config(data_dir,Config),FileName]),",nl,
indent(19),"[{xmlbase,filename:join([?config(data_dir,Config),",nl,
indent(19),"XMLBase])}]),",nl]),
emit(IO,[indent(3),"{VE,S2} = xmerl_xsd:validate(E,[{state,State}]),",nl]),
emit(IO,[indent(3),"case Validity of",nl,
indent(6),"valid when is_record(VE,xmlElement) ->",nl,
indent(9),"{filename:basename(FileName),S2#xsd_state.errors == []};",nl,
indent(6),"invalid when VE == error ->",nl,
indent(9),"{filename:basename(FileName),true};",nl,
indent(6),"notKnown ->",nl,
indent(9),"{filename:basename(FileName),true};",nl,
indent(6),"_ ->",nl,
indent(9),"{filename:basename(FileName),false}",nl,
indent(3),"end.",nl]).
%% emit(IO,[indent(3),"{VE,_} = xmerl_xsd:validate(E,[{state,State}]),",nl]),
%% emit(IO,[indent(3),"{filename:basename(FileName),VE == ExpectedRetVal}."]).
exclude_case(_Suite,[]) ->
false;
exclude_case(Suite,[#xmlAttribute{value=Name}]) ->
exlude_case(Suite,Name).
exlude_case(msx,Case) ->
lists:member(Case,["attC002","mgS002","mgS003","mgS004","mgS005"]);
exlude_case(_,_) ->
false.