Changeset 94
- Timestamp:
- 03/03/10 18:13:46 (2 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
-
doc/TODO (modified) (1 diff)
-
src/compiler.erl (modified) (5 diffs)
-
src/compiler_test.erl (modified) (3 diffs)
-
src/tester_test.erl (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/doc/TODO
r93 r94 4 4 ------------ 5 5 6 - a removed source file does not get removed from tester!!! 7 6 8 Check for possible bugs: 7 9 ----------------------- 8 9 - does a removed source file get removed from tester?10 10 11 11 Features? 12 12 --------- 13 13 14 - detect -include dependencies and recompile all when .hrl changes 14 - detect -include dependencies and recompile (all? includers?) when .hrl changes 15 - tests that never end (e.g. infinite loop) 15 16 - run tests in parallel 16 17 - run a single (specific) test -
trunk/src/compiler.erl
r93 r94 6 6 -export ([init/2]). 7 7 -export ([init/3]). 8 -export ([reset_includes/2]). 8 9 9 10 init (Notify, Dir) -> … … 13 14 Args = [Dir, notify_me ()], 14 15 Watcher = spawn_link (directory_watcher, init_recursive, Args), 15 State = {dict: new (), [], [], Options},16 State = {dict: new (), dict: new (), [], [], [{i, Dir} | Options]}, 16 17 loop (Notify, Watcher, State). 17 18 … … 20 21 check -> 21 22 Watcher ! check, 22 {Modules, Binaries, Removed, Options} = State, 23 case receive_files (Watcher, Modules) of 24 Modules -> 25 loop (Notify, Watcher, State); 26 Changed -> 27 New_state = {Changed, Binaries, Removed, Options}, 28 compile (Notify, Watcher, New_state) 29 end; 23 {Modules, Includes, Binaries, Removed, Options} = State, 24 Received = receive_files (Watcher, Modules, Includes), 25 {New_modules, New_includes} = Received, 26 New_options = reset_includes (New_includes, Options), 27 New_state = {New_modules, New_includes, Binaries, Removed, New_options}, 28 Last_state = 29 if 30 New_modules /= Modules -> 31 compile (Notify, New_state); 32 true -> 33 New_state 34 end, 35 loop (Notify, Watcher, Last_state); 30 36 {Pid, stop} -> 31 37 Pid ! {self (), bye} 32 38 end. 33 39 34 receive_files (Watcher, Modules) -> 40 receive_files (Watcher, Modules, Includes) -> 41 %% Includes = sets: from_list ([D || {i, D} <- Options]), 35 42 receive 36 43 {Watcher, {{file, ".erl"}, File, Event}} -> 37 receive_files (Watcher, dict: store (File, Event, Modules)); 44 receive_files (Watcher, dict: store (File, Event, Modules), Includes); 45 {Watcher, {{file, ".hrl"}, File, Event}} -> 46 receive_files (Watcher, Modules, dict: store (File, Event, Includes)); 38 47 {Watcher, _} -> 39 receive_files (Watcher, Modules )48 receive_files (Watcher, Modules, Includes) 40 49 after 500 -> 41 Modules50 {Modules, Includes} 42 51 end. 43 52 44 compile (Notify, Watcher,State) ->45 {Modules, _, _, _ } = State,53 compile (Notify, State) -> 54 {Modules, _, _, _, _} = State, 46 55 Notify (totals (Modules)), 47 56 Process = process_fun (Notify), 48 57 Processed = dict: fold (Process, State, Modules), 49 Notified = notify_end (Notify, Processed), 50 loop (Notify, Watcher, Notified). 58 notify_end (Notify, Processed). 59 60 reset_includes (Dict, Options) -> 61 dict: fold (fun reset_includes/3, Options, Dict). 62 63 reset_includes (File, found, Options) -> 64 Is_include = fun ({i, _}) -> true; (_) -> false end, 65 {Includes, Other} = lists: partition (Is_include, Options), 66 Dirs = sets: from_list ([D || {i, D} <- Includes]), 67 Dir = filename: dirname (File), 68 New_dirs = sets: add_element (Dir, Dirs), 69 New_includes = [{i, D} || D <- sets: to_list (New_dirs)], 70 Other ++ New_includes; 71 reset_includes (_, _, Options) -> 72 Options. 51 73 52 74 process_fun (Notify) -> 53 75 fun (File, Event, Acc) when Event == found; Event == changed -> 54 {Modules, Binaries, Removed, Options} = Acc,76 {Modules, Includes, Binaries, Removed, Options} = Acc, 55 77 Result = modules: compile (File, Options), 56 78 notify_result (Result, Notify), … … 58 80 Notify (totals (New_modules)), 59 81 New_binaries = binaries (Result, Binaries), 60 {New_modules, New_binaries, Removed, Options};82 {New_modules, Includes, New_binaries, Removed, Options}; 61 83 (File, Event, Acc) when Event == lost -> 62 {Modules, Binaries, Removed, Options} = Acc,84 {Modules, Includes, Binaries, Removed, Options} = Acc, 63 85 New_modules = dict: erase (File, Modules), 64 86 New_removed = [modules: module_name (File) | Removed], 65 {New_modules, Binaries, New_removed, Options};87 {New_modules, Includes, Binaries, New_removed, Options}; 66 88 (_, _, Acc) -> 67 89 Acc … … 97 119 98 120 notify_end (Notify, State) -> 99 {Modules, _, _, _} = State,121 {Modules, _, _, _, _} = State, 100 122 notify_end (Notify, totals (Modules), State). 101 123 102 notify_end (Notify, {N, N, N}, {Modules, Binaries, Removed, Options}) ->124 notify_end (Notify, {N, N, N}, {Modules, Includes, Binaries, Removed, Options}) -> 103 125 Notify ({{binaries, Binaries}, {removed, Removed}}), 104 {Modules, [], [], Options};126 {Modules, Includes, [], [], Options}; 105 127 notify_end (_, _, State) -> 106 128 State. -
trunk/src/compiler_test.erl
r93 r94 14 14 -export ([provides_all_binaries_not_just_latest_when_all_compiled/0]). 15 15 -export ([can_be_given_include_directories/0]). 16 -export ([discovers_hrl_files_and_includes_their_path/0]). 17 -export ([adds_root_to_include_path/0]). 18 -export ([reset_includes_none/0]). 19 -export ([reset_includes_found/0]). 16 20 -include_lib("stdlib/include/ms_transform.hrl"). 17 21 … … 71 75 ok = fixtures: use_tree (Tree, fun include_no_directory/2), 72 76 ok = fixtures: use_tree (Tree, fun include_with_directory/2). 77 78 adds_root_to_include_path () -> 79 Tree = 80 [{directory, "include", 81 [{file, "eg_include.hrl", "-define(eg_macro,ok)."}]}, 82 {directory, "src", 83 [{file, "eg_code_with_include.erl", 84 ["-module (eg_code_with_include).", 85 "-test (ok).", 86 "-export ([ok/0]).", 87 "-include (\"include/eg_include.hrl\").", 88 "ok () ->", 89 " ok = ?eg_macro."]}]}], 90 ok = fixtures: use_tree (Tree, fun adds_root_to_include_path/2). 91 92 adds_root_to_include_path (Root, _) -> 93 Compiler = spawn_link (compiler, init, [notify_me (), Root]), 94 Compiler ! check, 95 Ms = receive_all (), 96 Compiler ! stop, 97 [{1, 0, 0}, {1, 1, 1}, {{binaries, _}, _}] = Ms, 98 ok. 99 100 discovers_hrl_files_and_includes_their_path () -> 101 Tree = 102 [{directory, "include", 103 [{file, "eg_include.hrl", "-define(eg_macro,ok)."}]}, 104 {directory, "src", 105 [{file, "eg_code_with_include.erl", 106 ["-module (eg_code_with_include).", 107 "-test (ok).", 108 "-export ([ok/0]).", 109 "-include (\"eg_include.hrl\").", 110 "ok () ->", 111 " ok = ?eg_macro."]}]}], 112 ok = fixtures: use_tree (Tree, fun discovers_hrl/2). 113 114 discovers_hrl (Root, _) -> 115 Compiler = spawn_link (compiler, init, [notify_me (), Root]), 116 Compiler ! check, 117 Ms = receive_all (), 118 Compiler ! stop, 119 [{1, 0, 0}, {1, 1, 1}, _] = Ms, 120 ok. 73 121 74 122 provides_binaries_when_all_compiled (Root, _) -> … … 205 253 after 2000 -> lists: reverse ([timeout | Ms]) 206 254 end. 255 256 reset_includes_none () -> 257 [debug, bla] = compiler: reset_includes (dict: new (), [debug, bla]). 258 259 reset_includes_found () -> 260 Found = [{"/dir/file.hrl", found}, {"/dir/subdir/file2.hrl", found}], 261 New = dict: from_list (Found), 262 Options = [debug, bla], 263 Expected = [debug, bla, {i, "/dir/subdir"}, {i, "/dir"}], 264 Expected = compiler: reset_includes (New, Options). -
trunk/src/tester_test.erl
r92 r94 138 138 [{1, 0, 0}, {1, 1, 1}] = Results, 139 139 ok = receive {Tester, bye} -> ok after 100 -> timeout end. 140 140 141 141 receive_all (Ms) -> 142 142 receive … … 203 203 ]. 204 204 205 %%% Test to be added:206 %%% tests that never end (e.g. infinite loop)207 %%% Code loading and re-running all tests when one of many is refreshed
Note: See TracChangeset
for help on using the changeset viewer.
