소스 검색

fix FileWatcherEvent and adjust test

Simon Krajewski 6 년 전
부모
커밋
f03ff697e2
3개의 변경된 파일42개의 추가작업 그리고 27개의 파일을 삭제
  1. 1 1
      src/macro/eval/evalHash.ml
  2. 1 1
      src/macro/eval/evalStdLib.ml
  3. 40 25
      tests/asys/test/TestAsyncFileSystem.hx

+ 1 - 1
src/macro/eval/evalHash.ml

@@ -154,7 +154,7 @@ let key_asys_net_Address = hash "asys.net.Address"
 let key_asys_net_SocketAddress = hash "asys.net.SocketAddress"
 let key_eval_uv_Timer = hash "eval.uv.Timer"
 let key_eval_uv_Process = hash "eval.uv.Process"
-let key_sys_FileWatcherEvent = hash "sys.FileWatcherEvent"
+let key_asys_FileWatcherEvent = hash "asys.FileWatcherEvent"
 let key_eval_uv_Pipe = hash "eval.uv.Pipe"
 let key_eval_uv_Stream = hash "eval.uv.Stream"
 let key_eval_uv_PipeAccept = hash "eval.uv.PipeAccept"

+ 1 - 1
src/macro/eval/evalStdLib.ml

@@ -3132,7 +3132,7 @@ module StdUv = struct
 							if event > 3 then
 								assert false;
 							(* event: 1 = Rename, 2 = Change, 3 = Rename + Change *)
-							encode_enum_value key_sys_FileWatcherEvent (event - 1) [|encode_string path|] None
+							encode_enum_value key_asys_FileWatcherEvent (event - 1) [|encode_string path|] None
 						))) in
 					encode_instance key_eval_uv_FileWatcher ~kind:(IUv (UvFsEvent handle))
 				| _ -> assert false

+ 40 - 25
tests/asys/test/TestAsyncFileSystem.hx

@@ -1,5 +1,6 @@
 package test;
 
+import asys.FileWatcherEvent;
 import utest.Async;
 import asys.FileSystem as NewFS;
 import asys.io.File as NewFile;
@@ -73,17 +74,20 @@ class TestAsyncFileSystem extends Test {
 		eq(asyncDone, 0);
 	}
 
-	@:timeout(3000)
 	function testWatcher(async:Async) {
-		if (Sys.systemName() == "Windows" || Sys.systemName() == "Linux") { // TODO
-			t(true);
-			async.done();
-			return;
-		}
-
 		var dir = "resources-rw/watch";
 		sys.FileSystem.createDirectory(dir);
-		var events = [];
+		var expectedEvents:Array<FileWatcherEvent -> Bool> = [
+			event -> event.match(Rename("foo")),
+			event -> switch(event) {
+				case Rename("foo/hello.txt" | "foo\\hello.txt"): true;
+				case _: false;
+			},
+			event -> switch(event) {
+				case Change("foo/hello.txt" | "foo\\hello.txt"): true;
+				case _: false;
+			}
+		];
 
 		var watcher = NewFS.watch(dir, true);
 		watcher.closeSignal.on(_ -> {
@@ -91,24 +95,35 @@ class TestAsyncFileSystem extends Test {
 			OldFS.deleteDirectory(dir);
 		});
 		watcher.errorSignal.on(e -> assert('unexpected error: ${e.message}'));
-		watcher.changeSignal.on(events.push);
-
-		NewFS.mkdir('$dir/foo');
-
-		t(events.length == 1 && events[0].match(Rename("foo")));
-		events.resize(0);
-
-		var file = NewFS.open('$dir/foo/hello.txt', "w");
-		file.truncate(10);
-		file.close();
-		NewFS.unlink('$dir/foo/hello.txt');
 
-		NewFS.rmdir('$dir/foo');
-
-		t(events.length == 2 && events[0].match(Rename("foo/hello.txt")));
-		t(events.length == 2 && events[1].match(Rename("foo")));
-		events.resize(0);
+		var continuations = [];
+
+		watcher.changeSignal.on(event -> {
+			t(expectedEvents.length > 0);
+			var expected = expectedEvents.shift();
+			t(expected(event));
+			if (continuations.length > 0) {
+				continuations.shift()();
+			}
+			if (expectedEvents.length == 0) {
+				watcher.close();
+			}
+		});
 
-		watcher.close();
+		continuations.push(() -> {
+			var file = NewFS.open('$dir/foo/hello.txt', "w");
+			file.truncate(10);
+			file.close();
+		});
+		continuations.push(() -> {
+			var file = NewFS.open('$dir/foo/hello.txt', "w");
+			file.truncate(5);
+			file.close();
+		});
+		continuations.push(() -> {
+			NewFS.unlink('$dir/foo/hello.txt');
+			NewFS.rmdir('$dir/foo');
+		});
+		NewFS.mkdir('$dir/foo');
 	}
 }