2 using System.Collections.Generic;
3 using System.Threading;
5 using NaGet.SubCommands.SubTask;
8 using NaGet.SubCommands;
10 namespace test_na_get_lib
13 public class NaGetTaskSet2Test
16 public void SubTasks()
18 IList<string> subTaskMsgs = new string[]{"0", "1", "2"};
19 IList<NaGetSubTask> subTasks = new NaGetSubTask[] {
20 new FunctionalSubTask(null, null),
21 new FunctionalSubTask(null, null),
22 new FunctionalSubTask(null, null),
24 ATaskSetForTest task = new ATaskSetForTest(subTaskMsgs, subTasks);
26 Assert.AreEqual(subTaskMsgs, task.TaskSetNames);
30 public void NotifyGoToNextSubTask()
32 ATaskSetForTest task = null;
33 IList<NaGetSubTask> subTasks = null;
35 IList<string> subTaskMsgs = new string[]{"0", "1", "2"};
37 Action<object>[] funcs = new Action<object>[] {
38 delegate (object arg) {
40 Assert.AreEqual(0, task.CurrentTaskSetIndex);
41 Assert.IsTrue(task.Running);
42 Assert.IsTrue(subTasks[0].Running);
43 Assert.IsFalse(subTasks[1].Running);
45 delegate (object arg) {
47 Assert.IsTrue(task.Running);
48 Assert.IsTrue(subTasks[0].Done);
49 Assert.IsTrue(subTasks[1].Running);
50 Assert.IsFalse(subTasks[2].Running);
52 delegate (object arg) {
54 Assert.IsTrue(task.Running);
55 Assert.IsTrue(subTasks[1].Done);
56 Assert.IsTrue(subTasks[2].Running);
59 subTasks = new NaGetSubTask[] {
60 new FunctionalSubTask(funcs[0], null),
61 new FunctionalSubTask(funcs[1], null),
62 new FunctionalSubTask(funcs[2], null),
64 task = new ATaskSetForTest(subTaskMsgs, subTasks);
67 Assert.IsTrue(task.Done);
68 Assert.IsTrue(subTasks[0].Done);
69 Assert.IsTrue(subTasks[1].Done);
70 Assert.IsTrue(subTasks[2].Done);
71 Assert.AreEqual(3, blockCount);
75 public void NotifyGoToSubTask()
77 ATaskSetForTest task = null;
78 IList<NaGetSubTask> subTasks = null;
80 IList<string> subTaskMsgs = new string[]{"0", "1"};
81 List<int> blockPass = new List<int>();
82 Action<object>[] funcs = new Action<object>[] {
83 delegate (object arg) {
85 Assert.AreEqual(0, task.CurrentTaskSetIndex);
86 Assert.IsTrue(task.Running);
87 Assert.IsTrue(subTasks[0].Running);
88 Assert.IsFalse(subTasks[1].Running);
90 delegate (object arg) {
92 Assert.IsTrue(task.Running);
93 Assert.IsTrue(subTasks[0].Done);
94 Assert.IsTrue(subTasks[1].Running);
96 if (blockPass.Count < 6) {
97 throw new JumpTaskException(0);
101 subTasks = new NaGetSubTask[] {
102 new FunctionalSubTask(funcs[0], null),
103 new FunctionalSubTask(funcs[1], null),
105 task = new ATaskSetForTest(subTaskMsgs, subTasks);
108 Assert.IsTrue(task.Done);
109 Assert.AreEqual(new int[]{0, 1, 0, 1, 0, 1}, blockPass.ToArray());
113 public void TaskEventRaised()
115 ATaskSetForTest task = null;
116 IList<string> subTaskMsgs = new string[]{"0", "1"};
117 IList<NaGetSubTask> subTasks = null;
118 List<TaskEventArgs> taskEventList = new List<TaskEventArgs>();
119 List<TaskEventArgs> subtaskEventList = new List<TaskEventArgs>();
121 Action<ASubTaskForEventTest> subTaskBody = delegate(ASubTaskForEventTest subTask) {
122 subTask.RaiseTaskSetEventExt(TaskEventType.STARTED, "S", -1);
123 subTask.RaiseTaskSetEventExt(TaskEventType.INFO, "I", 0);
124 subTask.RaiseTaskSetEventExt(TaskEventType.PING, "P", 50);
125 subTask.RaiseTaskSetEventExt(TaskEventType.WARNING, "W", 75);
126 subTask.RaiseTaskSetEventExt(TaskEventType.COMPLETED,"C", 100);
128 subTasks = new NaGetSubTask[] {
129 new ASubTaskForEventTest(subTaskBody),
130 new ASubTaskForEventTest(subTaskBody),
132 task = new ATaskSetForTest(subTaskMsgs, subTasks);
134 EventHandler<TaskEventArgs> taskEventHandler = delegate(object sender, TaskEventArgs e) {
135 Assert.AreEqual(task, sender);
136 taskEventList.Add(e);
138 EventHandler<TaskEventArgs> subtaskEventHandler = delegate(object sender, TaskEventArgs e) {
139 Assert.AreEqual(subTasks[task.CurrentTaskSetIndex], sender);
140 subtaskEventList.Add(e);
143 // イベントをフックしているときの動作確認
145 task.TaskEventRaised += taskEventHandler;
146 task.SubTaskEventRaised += subtaskEventHandler;
148 taskEventList.Clear();
149 subtaskEventList.Clear();
151 Assert.IsTrue(task.Done);
153 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.STARTED, "", 0), taskEventList[0]);
154 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.STARTED_SUBTASK, "0", 0), taskEventList[1]);
155 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.PING, null, 0), taskEventList[2]);
156 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.PING, null, 25), taskEventList[3]);
157 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.PING, null, 37.5f), taskEventList[4]);
158 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.PING, null, 50), taskEventList[5]);
159 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.COMPLETED_SUBTASK,"0", 50), taskEventList[6]);
160 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.STARTED_SUBTASK, "1", 50), taskEventList[7]);
161 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.PING, null, 50), taskEventList[8]);
162 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.PING, null, 75), taskEventList[9]);
163 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.PING, null, 87.5f), taskEventList[10]);
164 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.PING, null, 100), taskEventList[11]);
165 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.COMPLETED_SUBTASK,"1", 100), taskEventList[12]);
166 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.COMPLETED, "", 100), taskEventList[13]);
167 Assert.AreEqual(14, taskEventList.Count);
169 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.STARTED, "S", -1), subtaskEventList[0]);
170 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.INFO, "I", 0), subtaskEventList[1]);
171 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.PING, "P", 50), subtaskEventList[2]);
172 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.WARNING, "W", 75), subtaskEventList[3]);
173 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.COMPLETED,"C", 100), subtaskEventList[4]);
174 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.STARTED, "S", -1), subtaskEventList[5]);
175 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.INFO, "I", 0), subtaskEventList[6]);
176 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.PING, "P", 50), subtaskEventList[7]);
177 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.WARNING, "W", 75), subtaskEventList[8]);
178 AreSameTaskEventArgs(new TaskEventArgs(TaskEventType.COMPLETED,"C", 100), subtaskEventList[9]);
179 Assert.AreEqual(10, subtaskEventList.Count);
181 // イベントをフックしていないときの動作確認
183 task.TaskEventRaised -= taskEventHandler;
184 task.SubTaskEventRaised -= subtaskEventHandler;
186 taskEventList.Clear();
187 subtaskEventList.Clear();
189 Assert.IsTrue(task.Done);
195 ATaskSetForTest task = null;
196 IList<string> subTaskMsgs = new string[]{"0"};
197 IList<NaGetSubTask> subTasks = null;
199 Action<ASubTaskForEventTest> subTaskBody = delegate(ASubTaskForEventTest subTask) {
200 subTask.RaiseTaskSetEventExt(TaskEventType.STARTED, "S", 0);
202 subTask.RaiseTaskSetEventExt(TaskEventType.COMPLETED,"C", 100);
204 bool? cancelRetVal = null;
205 ParameterizedThreadStart cancelThread = new ParameterizedThreadStart(
206 delegate (object param) {
207 Thread.Sleep((int) param);
208 cancelRetVal = task.Cancel();
212 // キャンセル無効なときはキャンセル処理は行われない。
214 subTasks = new NaGetSubTask[] { new ASubTaskForEventTest(subTaskBody) };
215 task = new ATaskSetForTest(subTaskMsgs, subTasks);
216 task._Cancelable = false;
218 (new Thread(cancelThread)).Start((object) 10);
220 Assert.AreEqual(false, cancelRetVal);
221 Assert.IsTrue(task.Done);
222 Assert.IsFalse(task.Cancelable);
224 // すでに終了しているものにはキャンセルはできない
225 Assert.IsFalse(task.Cancel());
227 // キャンセル有効なときでキャンセルするとき
228 subTasks = new NaGetSubTask[] { new ASubTaskForEventTest(subTaskBody) };
229 task = new ATaskSetForTest(subTaskMsgs, subTasks);
230 task._Cancelable = true;
232 (new Thread(cancelThread)).Start((object) 10);
234 Assert.AreEqual(true, cancelRetVal);
235 Assert.IsTrue(task.Cancelled);
236 Assert.IsFalse(task.Cancelable);
237 Assert.IsTrue(task.Done);
239 // すでにキャンセルしているものにはキャンセルはできない
240 Assert.IsFalse(task.Cancel());
243 bool cancelBlockPassed = false;
244 subTasks = new NaGetSubTask[] { new ASubTaskForEventTest(subTaskBody) };
245 task = new ATaskSetForTest(subTaskMsgs, subTasks);
246 task._Cancelable = true;
247 task.OnCancelCalled += delegate(object arg) {
248 Assert.IsFalse(task.Cancelled);
249 Assert.IsTrue(task.Running);
250 Assert.IsFalse(task.Cancelable);
251 Assert.IsFalse(task.Cancel());
253 ASubTaskForEventTest subTask = ((ASubTaskForEventTest) subTasks[0]);
254 Assert.IsFalse(subTask.Cancelled);
255 Assert.IsTrue(subTask.Running);
256 Assert.IsFalse(subTask.Cancelable);
257 Assert.IsFalse(subTask.Cancel());
259 cancelBlockPassed = true;
261 ((ASubTaskForEventTest) subTasks[0])._Cancelable = true;
263 (new Thread(cancelThread)).Start((object) 10);
265 Assert.AreEqual(true, cancelRetVal);
266 Assert.IsTrue(task.Cancelled);
267 Assert.IsFalse(task.Cancelable);
268 Assert.IsTrue(task.Done);
269 Assert.IsTrue(((ASubTaskForEventTest) subTasks[0]).Cancelled);
270 Assert.IsFalse(((ASubTaskForEventTest) subTasks[0]).Cancelable);
271 Assert.IsTrue(cancelBlockPassed);
275 public void RaiseTaskSetQueryEvent()
277 IList<string> subTaskMsgs = new string[]{"0"};
278 ATaskSetForTest task = null;
279 Action<object> subTaskBody = null;
280 IList<NaGetSubTask> subTasks = null;
281 bool blockPassed = false;
283 subTaskBody = delegate (object arg) {
284 NaGetTaskQueryResult ret;
285 ret = task.RaiseTaskSetQueryEventExt("#1", NaGetTaskQueryResult.CONTINUE);
286 Assert.AreEqual(NaGetTaskQueryResult.CANCELED_AUTOMATICALLY, ret);
290 subTasks = new NaGetSubTask[] {
291 new FunctionalSubTask(subTaskBody, null),
293 task = new ATaskSetForTest(subTaskMsgs, subTasks);
295 Assert.IsTrue(task.Done);
296 Assert.IsTrue(blockPassed);
299 subTaskBody = delegate (object arg) {
300 NaGetTaskQueryResult ret;
301 ret = task.RaiseTaskSetQueryEventExt("#1", NaGetTaskQueryResult.CONTINUE);
302 Assert.AreEqual(NaGetTaskQueryResult.CONTINUE, ret);
303 ret = task.RaiseTaskSetQueryEventExt("#2", (NaGetTaskQueryResult.RETRY | NaGetTaskQueryResult.CANCEL));
304 Assert.AreEqual(NaGetTaskQueryResult.RETRY, ret);
308 subTasks = new NaGetSubTask[] {
309 new FunctionalSubTask(subTaskBody, null),
311 task = new ATaskSetForTest(subTaskMsgs, subTasks);
312 task.TaskQueryRaised += delegate (object sender, NaGetTaskQueryArgs e) {
313 if (e.Message == "#1") {
314 Assert.AreEqual(NaGetTaskQueryResult.CONTINUE, e.SelectionFlag);
315 return NaGetTaskQueryResult.CONTINUE;
317 Assert.AreEqual((NaGetTaskQueryResult.RETRY | NaGetTaskQueryResult.CANCEL), e.SelectionFlag);
318 return NaGetTaskQueryResult.RETRY;
322 Assert.IsTrue(task.Done);
323 Assert.IsTrue(blockPassed);
326 private void AreSameTaskEventArgs(TaskEventArgs expected, TaskEventArgs actual)
328 string expectedLabel= string.Format("[type={0}, message=\"{1}\", percent={2}%]", expected.Type, expected.TaskMessage, expected.ProgressPercent);
329 string actualLabel = string.Format("[type={0}, message=\"{1}\", percent={2}%]", actual.Type, actual.TaskMessage, actual.ProgressPercent);
330 string failtureMsg = string.Format("Expected: {0}\tBut was: {1}", expectedLabel, actualLabel);
332 Assert.AreEqual(expected.Type, actual.Type, failtureMsg);
333 Assert.AreEqual(expected.TaskMessage, actual.TaskMessage, failtureMsg);
334 Assert.AreEqual(expected.ProgressPercent, actual.ProgressPercent, failtureMsg);
339 private class JumpTaskException : Exception
341 public int subTaskId = -1;
346 /// <param name="id">ジャンプ先のサブタスクID</param>
347 public JumpTaskException(int id)
353 private class ATaskSetForTest : NaGetTaskSet2
355 public event Action<object> OnCancelCalled;
357 public ATaskSetForTest(IList<string> subTaskMsgs, IList<NaGetSubTask> subTasks)
360 Assert.IsTrue(subTaskMsgs.Count == subTasks.Count);
362 for (int i = 0; i < subTaskMsgs.Count; i++) {
363 registSubTask(subTaskMsgs[i], subTasks[i]);
366 this.onCancelCalled += new Action<object>(delegate (object arg) {
367 if (OnCancelCalled != null) {
373 public override void Run()
376 RaiseTaskSetEvent(TaskEventType.STARTED, string.Empty);
378 while (hasMoreSubTask) {
380 RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, currentSubTaskName);
381 currentSubTask.Run();
382 RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, currentSubTaskName);
384 NotifyGoToNextSubTask();
385 } catch (JumpTaskException ex) {
386 NotifyGoToSubTask(ex.subTaskId);
392 RaiseTaskSetEvent(TaskEventType.CANCELED, string.Empty);
395 RaiseTaskSetEvent(TaskEventType.COMPLETED, string.Empty);
400 private bool cancelable = false;
402 public override bool Cancelable {
403 get { return cancelable && !cancelCalled && !isCancelled; }
406 public virtual bool _Cancelable {
407 set { cancelable = value; }
410 public NaGetTaskQueryResult RaiseTaskSetQueryEventExt(string message, NaGetTaskQueryResult selection)
412 return RaiseTaskSetQueryEvent(message, selection);
416 private class ASubTaskForEventTest : NaGetSubTask
418 private Action<ASubTaskForEventTest> func = null;
420 public ASubTaskForEventTest(Action<ASubTaskForEventTest> func)
425 public void RaiseTaskSetEventExt(TaskEventType type, string message, float percent)
427 RaiseTaskSetEvent(type, message, percent);
430 public override void Run()
444 private bool cancelable = false;
446 public override bool Cancelable {
447 get { return cancelable && !cancelCalled && !Cancelled; }
450 public virtual bool _Cancelable {
451 set { cancelable = value; }
454 private bool cancelCalled = true;
456 public override bool Cancel()
462 return base.Cancel();