diff options
author | Stavros Aronis <[email protected]> | 2011-02-18 20:02:00 +0200 |
---|---|---|
committer | Stavros Aronis <[email protected]> | 2011-02-28 17:13:50 +0200 |
commit | 059ca05caa95d91411c071c8542cef400a066e17 (patch) | |
tree | 073196bc28cc9f7ad4c46941d58351d14121ced8 /lib/dialyzer/test/dialyzer_test.erl | |
parent | 8bbf860b2f21571a4675a1a031cb95f25a10f391 (diff) | |
download | otp-059ca05caa95d91411c071c8542cef400a066e17.tar.gz otp-059ca05caa95d91411c071c8542cef400a066e17.tar.bz2 otp-059ca05caa95d91411c071c8542cef400a066e17.zip |
Major restructure of dialyzer's testsuite
Generation of the PLT is now performed without using OS commands.
We still try to copy in the default plt to make small scale testing
efficient. If generation/checking fails, suites are skipped except
plt_tests_SUITE which contains a bare PLT check that fails normally.
Diffstat (limited to 'lib/dialyzer/test/dialyzer_test.erl')
-rw-r--r-- | lib/dialyzer/test/dialyzer_test.erl | 200 |
1 files changed, 0 insertions, 200 deletions
diff --git a/lib/dialyzer/test/dialyzer_test.erl b/lib/dialyzer/test/dialyzer_test.erl deleted file mode 100644 index 26b4e146cc..0000000000 --- a/lib/dialyzer/test/dialyzer_test.erl +++ /dev/null @@ -1,200 +0,0 @@ --module(dialyzer_test). - --export([dialyzer_test/6]). - --include("test_server.hrl"). - --define(test_case_dir, "src"). --define(results_dir,"results"). --define(plt_filename,".dialyzer_plt"). --define(required_modules, "kernel stdlib compiler erts"). - -dialyzer_test(Options, TestCase, Kind, Dir, OutDir, Dog) -> - PltFilename = filename:join(OutDir, ?plt_filename), - case file:read_file_info(PltFilename) of - {ok, _} -> ok; - {error, _ } -> create_plt(OutDir, Dog) - end, - SrcDir = filename:join(Dir, ?test_case_dir), - ResDir = filename:join(Dir, ?results_dir), - TestCaseString = atom_to_list(TestCase), - Filename = filename:join(SrcDir, TestCaseString), - CorrectOptions = convert_relative_paths(Options, Dir), - FilesOption = - case Kind of - file -> {files, [Filename ++ ".erl"]}; - dir -> {files_rec, [Filename]} - end, - ResFile = TestCaseString, - NewResFile = filename:join(OutDir, ResFile), - OldResFile = filename:join(ResDir, ResFile), - RawWarns = dialyzer:run([FilesOption, - {init_plt, PltFilename}, - {from, src_code}, - {check_plt, false} | CorrectOptions]), - Warns = lists:sort([dialyzer:format_warning(W) || W <- RawWarns]), - case Warns of - [] -> ok; - _ -> - case file:open(NewResFile,['write']) of - {ok, OutFile} -> - io:format(OutFile,"\n~s",[Warns]), - file:close(OutFile); - Other -> erlang:error(Other) - end - end, - case diff(NewResFile, OldResFile) of - 'same' -> file:delete(NewResFile), - 'same'; - Any -> Any - end. - -create_plt(OutDir, Dog) -> - PltFilename = filename:join(OutDir, ?plt_filename), - ?t:timetrap_cancel(Dog), - ?t:format("Generating plt..."), - HomeDir = os:getenv("HOME"), - HomePlt = filename:join(HomeDir, ?plt_filename), - file:copy(HomePlt, PltFilename), - try - AddCommand = "dialyzer --add_to_plt --output_plt " ++ - PltFilename ++ " --apps " ++ ?required_modules, - ?t:format(AddCommand ++ "\n"), - ?t:format(os:cmd(AddCommand)), - dialyzer:run([{analysis_type, plt_check}, - {init_plt, PltFilename}]) of - [] -> ok - catch - _:_ -> - BuildCommand = "dialyzer --build_plt --output_plt " ++ - PltFilename ++ " --apps " ++ ?required_modules, - ?t:format(BuildCommand ++ "\n"), - ?t:format(os:cmd(BuildCommand)) - end. - -convert_relative_paths(Options, Dir) -> - convert_relative_paths(Options, Dir, []). - -convert_relative_paths([], _Dir, Acc) -> - Acc; -convert_relative_paths([{include_dirs, Paths}|Rest], Dir, Acc) -> - AbsolutePaths = convert_relative_paths_1(Paths, Dir, []), - convert_relative_paths(Rest, Dir, [{include_dirs, AbsolutePaths}|Acc]); -convert_relative_paths([Option|Rest], Dir, Acc) -> - convert_relative_paths(Rest, Dir, [Option|Acc]). - -convert_relative_paths_1([], _Dir, Acc) -> - Acc; -convert_relative_paths_1([Path|Rest], Dir, Acc) -> - convert_relative_paths_1(Rest, Dir, [filename:join(Dir, Path)|Acc]). - -diff(Filename1, Filename2) -> - File1 = - case file:open(Filename1, [read]) of - {ok, F1} -> {file, F1}; - _ -> empty - end, - File2 = - case file:open(Filename2, [read]) of - {ok, F2} -> {file, F2}; - _ -> empty - end, - case diff1(File1, File2) of - {error, {N, Error}} -> - case N of - 1 -> {error, {Filename1, Error}}; - 2 -> {error, {Filename2, Error}} - end; - [] -> 'same'; - DiffList -> {'differ', DiffList} - end. - -diff1(File1, File2) -> - case file_to_lines(File1) of - {error, Error} -> {error, {1, Error}}; - Lines1 -> - case file_to_lines(File2) of - {error, Error} -> {error, {2, Error}}; - Lines2 -> - Common = lcs_fast(Lines1, Lines2), - diff2(Lines1, 1, Lines2, 1, Common, []) - end - end. - -diff2([], _, [], _, [], Acc) -> lists:keysort(2,Acc); -diff2([H1|T1], N1, [], N2, [], Acc) -> - diff2(T1, N1+1, [], N2, [], [{new, N1, H1}|Acc]); -diff2([], N1, [H2|T2], N2, [], Acc) -> - diff2([], N1, T2, N2+1, [], [{old, N2, H2}|Acc]); -diff2([H1|T1], N1, [H2|T2], N2, [], Acc) -> - diff2(T1, N1+1, T2, N2+1, [], [{new, N1, H1}, {old, N2, H2}|Acc]); -diff2([H1|T1]=L1, N1, [H2|T2]=L2, N2, [HC|TC]=LC, Acc) -> - case H1 =:= H2 of - true -> diff2(T1, N1+1, T2, N2+1, TC, Acc); - false -> - case H1 =:= HC of - true -> diff2(L1, N1, T2, N2+1, LC, [{old, N2, H2}|Acc]); - false -> diff2(T1, N1+1, L2, N2, LC, [{new, N1, H1}|Acc]) - end - end. - --spec lcs_fast([string()], [string()]) -> [string()]. - -lcs_fast(S1, S2) -> - M = length(S1), - N = length(S2), - Acc = array:new(M*N, {default, 0}), - {L, _} = lcs_fast(S1, S2, 1, 1, N, Acc), - L. - --spec lcs_fast([string()], [string()], - pos_integer(), pos_integer(), - non_neg_integer(), array()) -> {[string()], array()}. - -lcs_fast([], _, _, _, _, Acc) -> - {[], Acc}; -lcs_fast(_, [], _, _, _, Acc) -> - {[], Acc}; -lcs_fast([H1|T1] = S1, [H2|T2] = S2, N1, N2, N, Acc) -> - I = (N1-1) * N + N2 - 1, - case array:get(I, Acc) of - 0 -> - case string:equal(H1, H2) of - true -> - {T, NAcc} = lcs_fast(T1, T2, N1+1, N2+1, N, Acc), - L = [H1|T], - {L, array:set(I, L, NAcc)}; - false -> - {L1, NAcc1} = lcs_fast(S1, T2, N1, N2+1, N, Acc), - {L2, NAcc2} = lcs_fast(T1, S2, N1+1, N2, N, NAcc1), - L = longest(L1, L2), - {L, array:set(I, L, NAcc2)} - end; - L -> - {L, Acc} - end. - --spec longest([string()], [string()]) -> [string()]. - -longest(S1, S2) -> - case length(S1) > length(S2) of - true -> S1; - false -> S2 - end. - -file_to_lines(empty) -> - []; -file_to_lines({file, File}) -> - case file_to_lines(File, []) of - {error, _} = Error -> Error; - Lines -> lists:reverse(Lines) - end. - -file_to_lines(File, Acc) -> - case io:get_line(File, "") of - {error, _}=Error -> Error; - eof -> Acc; - A -> file_to_lines(File, [A|Acc]) - end. - - |