Better naming.
2 %% * Callback을 프로세스로 돌리기
3 %% * 돌고 있는 콜백이 있으면 죽이고 시작하기
4 %% * LAST_SNAPSHOT의 변경 시각을 현재 파일의 변경 시각과 비교하기
6 -include_lib("eunit/include/eunit.hrl"). 9 -define(LATEST_SNAPSHOT, ".last").
10 -define(MTIME_PRECISION, 1000).
11 -define(TEST_FILE, "dut.txt").
12 -define(TEST_MODULE, dut).
14 is_modified(FileName, LastModified) ->
15 case filelib:last_modified(FileName) of
22 {ok, S} = file:open(FileName, write), 23 io:format(S, "touch", []),
28 Modified = filelib:last_modified("dut.txt"), 29 ?assertMatch(false, is_modified("dut.txt", Modified)), 30 timer:sleep(?MTIME_PRECISION),
32 ?assertMatch(true, is_modified("dut.txt", Modified)). 34 watch_loop(ModuleName, Callback) ->
35 watch_loop(ModuleName, Callback, 0).
37 watch_loop(ModuleName, Callback, LastModified) ->
41 after ?MTIME_PRECISION ->
42 case is_modified(file_name(ModuleName), LastModified) of
48 ?MODULE:watch_loop(ModuleName, Callback,
49 filelib:last_modified(file_name(ModuleName)))
54 Callback = fun(_) -> Me ! modified end,
55 Pid = spawn(fun() -> watch_loop(?TEST_MODULE, Callback) end),
64 ?assertMatch(true, Invoked).
66 show_diff(Old, New) ->
67 io:put_chars(os:cmd("diff -u " ++ Old ++ " " ++ New)). 70 file:copy(FileName, ?LATEST_SNAPSHOT).
72 test_module(ModuleName) ->
73 case c:c(ModuleName) of
75 apply(ModuleName, test, []);
80 file_name(ModuleName) ->
81 atom_to_list(ModuleName) ++ ".erl".
83 continuous_testing(ModuleName) ->
84 show_diff(?LATEST_SNAPSHOT, file_name(ModuleName)),
85 snapshot(file_name(ModuleName)),
86 test_module(ModuleName).
89 spawn(?MODULE, watch_loop, [ModuleName, fun continuous_testing/1]).