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);
238 // すでにキャンセルしているものにはキャンセルはできない
239 Assert.IsFalse(task.Cancel());
242 bool cancelBlockPassed = false;
243 subTasks = new NaGetSubTask[] { new ASubTaskForEventTest(subTaskBody) };
244 task = new ATaskSetForTest(subTaskMsgs, subTasks);
245 task._Cancelable = true;
246 task.OnCancelCalled += delegate(object arg) {
247 Assert.IsFalse(task.Cancelled);
248 Assert.IsTrue(task.Running);
249 Assert.IsFalse(task.Cancelable);
250 Assert.IsFalse(task.Cancel());
252 ASubTaskForEventTest subTask = ((ASubTaskForEventTest) subTasks[0]);
253 Assert.IsFalse(subTask.Cancelled);
254 Assert.IsTrue(subTask.Running);
255 Assert.IsFalse(subTask.Cancelable);
256 Assert.IsFalse(subTask.Cancel());
258 cancelBlockPassed = true;
260 ((ASubTaskForEventTest) subTasks[0])._Cancelable = true;
262 (new Thread(cancelThread)).Start((object) 10);
264 Assert.AreEqual(true, cancelRetVal);
265 Assert.IsTrue(task.Cancelled);
266 Assert.IsFalse(task.Cancelable);
267 Assert.IsTrue(((ASubTaskForEventTest) subTasks[0]).Cancelled);
268 Assert.IsFalse(((ASubTaskForEventTest) subTasks[0]).Cancelable);
269 Assert.IsTrue(cancelBlockPassed);
273 public void RaiseTaskSetQueryEvent()
275 IList<string> subTaskMsgs = new string[]{"0"};
276 ATaskSetForTest task = null;
277 Action<object> subTaskBody = null;
278 IList<NaGetSubTask> subTasks = null;
279 bool blockPassed = false;
281 subTaskBody = delegate (object arg) {
282 NaGetTaskQueryResult ret;
283 ret = task.RaiseTaskSetQueryEventExt("#1", NaGetTaskQueryResult.CONTINUE);
284 Assert.AreEqual(NaGetTaskQueryResult.CANCELED_AUTOMATICALLY, ret);
288 subTasks = new NaGetSubTask[] {
289 new FunctionalSubTask(subTaskBody, null),
291 task = new ATaskSetForTest(subTaskMsgs, subTasks);
293 Assert.IsTrue(task.Done);
294 Assert.IsTrue(blockPassed);
297 subTaskBody = delegate (object arg) {
298 NaGetTaskQueryResult ret;
299 ret = task.RaiseTaskSetQueryEventExt("#1", NaGetTaskQueryResult.CONTINUE);
300 Assert.AreEqual(NaGetTaskQueryResult.CONTINUE, ret);
301 ret = task.RaiseTaskSetQueryEventExt("#2", (NaGetTaskQueryResult.RETRY | NaGetTaskQueryResult.CANCEL));
302 Assert.AreEqual(NaGetTaskQueryResult.RETRY, ret);
306 subTasks = new NaGetSubTask[] {
307 new FunctionalSubTask(subTaskBody, null),
309 task = new ATaskSetForTest(subTaskMsgs, subTasks);
310 task.TaskQueryRaised += delegate (object sender, NaGetTaskQueryArgs e) {
311 if (e.Message == "#1") {
312 Assert.AreEqual(NaGetTaskQueryResult.CONTINUE, e.SelectionFlag);
313 return NaGetTaskQueryResult.CONTINUE;
315 Assert.AreEqual((NaGetTaskQueryResult.RETRY | NaGetTaskQueryResult.CANCEL), e.SelectionFlag);
316 return NaGetTaskQueryResult.RETRY;
320 Assert.IsTrue(task.Done);
321 Assert.IsTrue(blockPassed);
324 private void AreSameTaskEventArgs(TaskEventArgs expected, TaskEventArgs actual)
326 string expectedLabel= string.Format("[type={0}, message=\"{1}\", percent={2}%]", expected.Type, expected.TaskMessage, expected.ProgressPercent);
327 string actualLabel = string.Format("[type={0}, message=\"{1}\", percent={2}%]", actual.Type, actual.TaskMessage, actual.ProgressPercent);
328 string failtureMsg = string.Format("Expected: {0}\tBut was: {1}", expectedLabel, actualLabel);
330 Assert.AreEqual(expected.Type, actual.Type, failtureMsg);
331 Assert.AreEqual(expected.TaskMessage, actual.TaskMessage, failtureMsg);
332 Assert.AreEqual(expected.ProgressPercent, actual.ProgressPercent, failtureMsg);
337 private class JumpTaskException : Exception
339 public int subTaskId = -1;
344 /// <param name="id">ジャンプ先のサブタスクID</param>
345 public JumpTaskException(int id)
351 private class ATaskSetForTest : NaGetTaskSet2
353 public event Action<object> OnCancelCalled;
355 public ATaskSetForTest(IList<string> subTaskMsgs, IList<NaGetSubTask> subTasks)
358 Assert.IsTrue(subTaskMsgs.Count == subTasks.Count);
360 for (int i = 0; i < subTaskMsgs.Count; i++) {
361 registSubTask(subTaskMsgs[i], subTasks[i]);
364 this.onCancelCalled += new Action<object>(delegate (object arg) {
365 if (OnCancelCalled != null) {
371 public override void Run()
374 RaiseTaskSetEvent(TaskEventType.STARTED, string.Empty);
376 while (hasMoreSubTask) {
378 RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, currentSubTaskName);
379 currentSubTask.Run();
380 RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, currentSubTaskName);
382 NotifyGoToNextSubTask();
383 } catch (JumpTaskException ex) {
384 NotifyGoToSubTask(ex.subTaskId);
390 RaiseTaskSetEvent(TaskEventType.CANCELED, string.Empty);
393 RaiseTaskSetEvent(TaskEventType.COMPLETED, string.Empty);
398 private bool cancelable = false;
400 public override bool Cancelable {
401 get { return cancelable && !cancelCalled && !isCancelled; }
404 public virtual bool _Cancelable {
405 set { cancelable = value; }
408 public NaGetTaskQueryResult RaiseTaskSetQueryEventExt(string message, NaGetTaskQueryResult selection)
410 return RaiseTaskSetQueryEvent(message, selection);
414 private class ASubTaskForEventTest : NaGetSubTask
416 private Action<ASubTaskForEventTest> func = null;
418 public ASubTaskForEventTest(Action<ASubTaskForEventTest> func)
423 public void RaiseTaskSetEventExt(TaskEventType type, string message, float percent)
425 RaiseTaskSetEvent(type, message, percent);
428 public override void Run()
442 private bool cancelable = false;
444 public override bool Cancelable {
445 get { return cancelable && !cancelCalled && !Cancelled; }
448 public virtual bool _Cancelable {
449 set { cancelable = value; }
452 private bool cancelCalled = true;
454 public override bool Cancel()
460 return base.Cancel();