@@ -50,164 +50,224 @@ private void DisposeAfterTest(Action action)
5050 }
5151
5252 [ Fact ]
53- public async Task command_execute_on_kernel_specified_at_scheduling_time ( )
53+ public async Task scheduled_work_is_completed_in_order ( )
5454 {
55- var commandsHandledOnKernel1 = new List < KernelCommand > ( ) ;
56- var commandsHandledOnKernel2 = new List < KernelCommand > ( ) ;
55+ var scheduler = new KernelScheduler < int , int > ( ) ;
5756
58- var scheduler = new KernelCommandScheduler ( ) ;
57+ var executionList = new List < int > ( ) ;
5958
60- var kernel1 = new FakeKernel ( "kernel1" )
61- {
62- Handle = ( command , _ ) =>
63- {
64- commandsHandledOnKernel1 . Add ( command ) ;
65- return Task . CompletedTask ;
66- }
67- } ;
68- var kernel2 = new FakeKernel ( "kernel2" )
69- {
70- Handle = ( command , _ ) =>
71- {
72- commandsHandledOnKernel2 . Add ( command ) ;
73- return Task . CompletedTask ;
74- }
75- } ;
59+ await scheduler . Schedule ( 1 , ( v ) => executionList . Add ( v ) ) ;
60+ await scheduler . Schedule ( 2 , ( v ) => executionList . Add ( v ) ) ;
61+ await scheduler . Schedule ( 3 , ( v ) => executionList . Add ( v ) ) ;
7662
77- var command1 = new SubmitCode ( "for kernel 1" ) ;
78- var command2 = new SubmitCode ( "for kernel 2" ) ;
7963
80- await scheduler . Schedule ( command1 , kernel1 ) ;
81- await scheduler . Schedule ( command2 , kernel2 ) ;
64+ executionList . Should ( ) . BeEquivalentSequenceTo ( 1 , 2 , 3 ) ;
65+ }
8266
83- commandsHandledOnKernel1 . Should ( ) . ContainSingle ( ) . Which . Should ( ) . Be ( command1 ) ;
84- commandsHandledOnKernel2 . Should ( ) . ContainSingle ( ) . Which . Should ( ) . Be ( command2 ) ;
67+ [ Fact ]
68+ public void scheduled_work_does_not_execute_in_parallel ( )
69+ {
70+ throw new NotImplementedException ( ) ;
8571 }
8672
8773 [ Fact ]
88- public async Task scheduling_a_command_will_defer_deferred_commands_scheduled_on_same_kernel ( )
74+ public async Task deferred_work_is_executed_before_new_work ( )
8975 {
90- var commandsHandledOnKernel1 = new List < KernelCommand > ( ) ;
76+ var executionList = new List < int > ( ) ;
9177
92- var scheduler = new KernelCommandScheduler ( ) ;
78+ var scheduler = new KernelScheduler < int , int > ( ) ;
79+ scheduler . RegisterDeferredOperationSource (
80+ v => Enumerable . Repeat ( v * 10 , v ) , ( v ) => executionList . Add ( v ) ) ;
9381
94- var kernel1 = new FakeKernel ( "kernel1" )
95- {
96- Handle = ( command , _ ) =>
97- {
98- commandsHandledOnKernel1 . Add ( command ) ;
99- return Task . CompletedTask ;
100- }
101- } ;
102- var kernel2 = new FakeKernel ( "kernel2" )
103- {
104- Handle = ( _ , _ ) => Task . CompletedTask
105- } ;
106-
107- var deferredCommand1 = new SubmitCode ( "deferred for kernel 1" ) ;
108- var deferredCommand2 = new SubmitCode ( "deferred for kernel 2" ) ;
109- var deferredCommand3 = new SubmitCode ( "deferred for kernel 1" ) ;
110- var command1 = new SubmitCode ( "for kernel 1" ) ;
82+
11183
112- scheduler . DeferCommand ( deferredCommand1 , kernel1 ) ;
113- scheduler . DeferCommand ( deferredCommand2 , kernel2 ) ;
114- scheduler . DeferCommand ( deferredCommand3 , kernel1 ) ;
115- await scheduler . Schedule ( command1 , kernel1 ) ;
84+ await scheduler . Schedule ( 1 , ( v ) => executionList . Add ( v ) ) ;
85+ await scheduler . Schedule ( 2 , ( v ) => executionList . Add ( v ) ) ;
86+ await scheduler . Schedule ( 3 , ( v ) => executionList . Add ( v ) ) ;
11687
117- commandsHandledOnKernel1 . Should ( ) . NotContain ( deferredCommand2 ) ;
118- commandsHandledOnKernel1 . Should ( ) . BeEquivalentSequenceTo ( deferredCommand1 , deferredCommand3 , command1 ) ;
88+ executionList . Should ( ) . BeEquivalentSequenceTo ( 10 , 1 , 20 , 20 , 2 , 30 , 30 , 30 , 3 ) ;
11989 }
12090
12191 [ Fact ]
122- public async Task deferred_command_not_executed_are_still_in_deferred_queue ( )
92+ public async Task awaiting_one_operation_does_not_wait_all ( )
12393 {
124- var commandsHandledOnKernel1 = new List < KernelCommand > ( ) ;
125- var commandsHandledOnKernel2 = new List < KernelCommand > ( ) ;
94+ var executionList = new List < int > ( ) ;
12695
127- var scheduler = new KernelCommandScheduler ( ) ;
96+ var scheduler = new KernelScheduler < int , int > ( ) ;
12897
129- var kernel1 = new FakeKernel ( "kernel1" )
130- {
131- Handle = ( command , _ ) =>
132- {
133- commandsHandledOnKernel1 . Add ( command ) ;
134- return Task . CompletedTask ;
135- }
136- } ;
137- var kernel2 = new FakeKernel ( "kernel2" )
138- {
139- Handle = ( command , _ ) =>
140- {
141- commandsHandledOnKernel2 . Add ( command ) ;
142- return Task . CompletedTask ;
143- }
144- } ;
145-
146- var deferredCommand1 = new SubmitCode ( "deferred for kernel 1" ) ;
147- var deferredCommand2 = new SubmitCode ( "deferred for kernel 2" ) ;
148- var deferredCommand3 = new SubmitCode ( "deferred for kernel 1" ) ;
149- var command1 = new SubmitCode ( "for kernel 1" ) ;
150- var command2 = new SubmitCode ( "for kernel 2" ) ;
151-
152- scheduler . DeferCommand ( deferredCommand1 , kernel1 ) ;
153- scheduler . DeferCommand ( deferredCommand2 , kernel2 ) ;
154- scheduler . DeferCommand ( deferredCommand3 , kernel1 ) ;
155- await scheduler . Schedule ( command1 , kernel1 ) ;
156-
157- commandsHandledOnKernel2 . Should ( ) . BeEmpty ( ) ;
158- commandsHandledOnKernel1 . Should ( ) . NotContain ( deferredCommand2 ) ;
159- commandsHandledOnKernel1 . Should ( ) . BeEquivalentSequenceTo ( deferredCommand1 , deferredCommand3 , command1 ) ;
160- await scheduler . Schedule ( command2 , kernel2 ) ;
161- commandsHandledOnKernel2 . Should ( ) . BeEquivalentSequenceTo ( deferredCommand2 , command2 ) ;
98+
99+ await scheduler . Schedule ( 1 , ( v ) => executionList . Add ( v ) ) ;
100+ await scheduler . Schedule ( 2 , ( v ) => executionList . Add ( v ) ) ;
101+ scheduler . Schedule ( 3 , ( v ) => executionList . Add ( v ) ) ;
102+
103+ executionList . Should ( ) . BeEquivalentSequenceTo ( 10 , 1 , 20 , 20 , 2 ) ;
162104 }
163105
164106 [ Fact ]
165- public async Task deferred_command_on_parent_kernel_are_executed_when_scheduling_command_on_child_kernel ( )
107+ public void new_work_is_executed_after_all_require ( )
166108 {
167- var commandHandledList = new List < ( KernelCommand command , Kernel kernel ) > ( ) ;
168-
169- var scheduler = new KernelCommandScheduler ( ) ;
170-
171- var childKernel = new FakeKernel ( "kernel1" )
172- {
173- Handle = ( command , context ) => command . InvokeAsync ( context )
174- } ;
175- var parentKernel = new CompositeKernel
176- {
177- childKernel
178- } ;
179-
180- parentKernel . DefaultKernelName = childKernel . Name ;
181-
182- var deferredCommand1 = new TestCommand ( ( command , context ) =>
183- {
184- commandHandledList . Add ( ( command , context . HandlingKernel ) ) ;
185- return Task . CompletedTask ;
186- } , childKernel . Name ) ;
187- var deferredCommand2 = new TestCommand ( ( command , context ) =>
188- {
189- commandHandledList . Add ( ( command , context . HandlingKernel ) ) ;
190- return Task . CompletedTask ;
191- } , parentKernel . Name ) ;
192- var deferredCommand3 = new TestCommand ( ( command , context ) =>
193- {
194- commandHandledList . Add ( ( command , context . HandlingKernel ) ) ;
195- return Task . CompletedTask ;
196- } , childKernel . Name ) ;
197- var command1 = new TestCommand ( ( command , context ) =>
198- {
199- commandHandledList . Add ( ( command , context . HandlingKernel ) ) ;
200- return Task . CompletedTask ;
201- } , childKernel . Name ) ;
202-
203- scheduler . DeferCommand ( deferredCommand1 , childKernel ) ;
204- scheduler . DeferCommand ( deferredCommand2 , parentKernel ) ;
205- scheduler . DeferCommand ( deferredCommand3 , childKernel ) ;
206- await scheduler . Schedule ( command1 , childKernel ) ;
207-
208- commandHandledList . Select ( e => e . command ) . Should ( ) . BeEquivalentSequenceTo ( deferredCommand1 , deferredCommand2 , deferredCommand3 , command1 ) ;
209-
210- commandHandledList . Select ( e => e . kernel ) . Should ( ) . BeEquivalentSequenceTo ( childKernel , parentKernel , childKernel , childKernel ) ;
109+ throw new NotImplementedException ( ) ;
211110 }
111+
112+ //[Fact]
113+ //public async Task command_execute_on_kernel_specified_at_scheduling_time()
114+ //{
115+ // var commandsHandledOnKernel1 = new List<KernelCommand>();
116+ // var commandsHandledOnKernel2 = new List<KernelCommand>();
117+
118+ // var scheduler = new KernelCommandScheduler();
119+
120+ // var kernel1 = new FakeKernel("kernel1")
121+ // {
122+ // Handle = (command, _) =>
123+ // {
124+ // commandsHandledOnKernel1.Add(command);
125+ // return Task.CompletedTask;
126+ // }
127+ // };
128+ // var kernel2 = new FakeKernel("kernel2")
129+ // {
130+ // Handle = (command, _) =>
131+ // {
132+ // commandsHandledOnKernel2.Add(command);
133+ // return Task.CompletedTask;
134+ // }
135+ // };
136+
137+ // var command1 = new SubmitCode("for kernel 1", kernel1.Name);
138+ // var command2 = new SubmitCode("for kernel 2", kernel2.Name);
139+
140+ // await scheduler.Schedule(command1);
141+ // await scheduler.Schedule(command2);
142+
143+ // commandsHandledOnKernel1.Should().ContainSingle().Which.Should().Be(command1);
144+ // commandsHandledOnKernel2.Should().ContainSingle().Which.Should().Be(command2);
145+ //}
146+
147+ //[Fact]
148+ //public async Task scheduling_a_command_will_defer_deferred_commands_scheduled_on_same_kernel()
149+ //{
150+ // var commandsHandledOnKernel1 = new List<KernelCommand>();
151+
152+ // var scheduler = new KernelCommandScheduler();
153+
154+ // var kernel1 = new FakeKernel("kernel1")
155+ // {
156+ // Handle = (command, _) =>
157+ // {
158+ // commandsHandledOnKernel1.Add(command);
159+ // return Task.CompletedTask;
160+ // }
161+ // };
162+ // var kernel2 = new FakeKernel("kernel2")
163+ // {
164+ // Handle = (_, _) => Task.CompletedTask
165+ // };
166+
167+ // var deferredCommand1 = new SubmitCode("deferred for kernel 1", kernel1.Name);
168+ // var deferredCommand2 = new SubmitCode("deferred for kernel 2", kernel2.Name);
169+ // var deferredCommand3 = new SubmitCode("deferred for kernel 1", kernel1.Name);
170+ // var command1 = new SubmitCode("for kernel 1", kernel1.Name);
171+
172+ // scheduler.DeferCommand(deferredCommand1);
173+ // scheduler.DeferCommand(deferredCommand2);
174+ // scheduler.DeferCommand(deferredCommand3);
175+ // await scheduler.Schedule(command1);
176+
177+ // commandsHandledOnKernel1.Should().NotContain(deferredCommand2);
178+ // commandsHandledOnKernel1.Should().BeEquivalentSequenceTo(deferredCommand1, deferredCommand3, command1);
179+ //}
180+
181+ //[Fact]
182+ //public async Task deferred_command_not_executed_are_still_in_deferred_queue()
183+ //{
184+ // var commandsHandledOnKernel1 = new List<KernelCommand>();
185+ // var commandsHandledOnKernel2 = new List<KernelCommand>();
186+
187+ // var scheduler = new KernelCommandScheduler();
188+
189+ // var kernel1 = new FakeKernel("kernel1")
190+ // {
191+ // Handle = (command, _) =>
192+ // {
193+ // commandsHandledOnKernel1.Add(command);
194+ // return Task.CompletedTask;
195+ // }
196+ // };
197+ // var kernel2 = new FakeKernel("kernel2")
198+ // {
199+ // Handle = (command, _) =>
200+ // {
201+ // commandsHandledOnKernel2.Add(command);
202+ // return Task.CompletedTask;
203+ // }
204+ // };
205+
206+ // var deferredCommand1 = new SubmitCode("deferred for kernel 1");
207+ // var deferredCommand2 = new SubmitCode("deferred for kernel 2");
208+ // var deferredCommand3 = new SubmitCode("deferred for kernel 1");
209+ // var command1 = new SubmitCode("for kernel 1");
210+ // var command2 = new SubmitCode("for kernel 2");
211+
212+ // scheduler.DeferCommand(deferredCommand1, kernel1);
213+ // scheduler.DeferCommand(deferredCommand2, kernel2);
214+ // scheduler.DeferCommand(deferredCommand3, kernel1);
215+ // await scheduler.Schedule(command1, kernel1);
216+
217+ // commandsHandledOnKernel2.Should().BeEmpty();
218+ // commandsHandledOnKernel1.Should().NotContain(deferredCommand2);
219+ // commandsHandledOnKernel1.Should().BeEquivalentSequenceTo(deferredCommand1, deferredCommand3, command1);
220+ // await scheduler.Schedule(command2, kernel2);
221+ // commandsHandledOnKernel2.Should().BeEquivalentSequenceTo(deferredCommand2, command2);
222+ //}
223+
224+ //[Fact]
225+ //public async Task deferred_command_on_parent_kernel_are_executed_when_scheduling_command_on_child_kernel()
226+ //{
227+ // var commandHandledList = new List<(KernelCommand command, Kernel kernel)>();
228+
229+ // var scheduler = new KernelCommandScheduler();
230+
231+ // var childKernel = new FakeKernel("kernel1")
232+ // {
233+ // Handle = (command, context) => command.InvokeAsync(context)
234+ // };
235+ // var parentKernel = new CompositeKernel
236+ // {
237+ // childKernel
238+ // };
239+
240+ // parentKernel.DefaultKernelName = childKernel.Name;
241+
242+ // var deferredCommand1 = new TestCommand((command, context) =>
243+ // {
244+ // commandHandledList.Add((command, context.HandlingKernel));
245+ // return Task.CompletedTask;
246+ // }, childKernel.Name);
247+ // var deferredCommand2 = new TestCommand((command, context) =>
248+ // {
249+ // commandHandledList.Add((command, context.HandlingKernel));
250+ // return Task.CompletedTask;
251+ // }, parentKernel.Name);
252+ // var deferredCommand3 = new TestCommand((command, context) =>
253+ // {
254+ // commandHandledList.Add((command, context.HandlingKernel));
255+ // return Task.CompletedTask;
256+ // }, childKernel.Name);
257+ // var command1 = new TestCommand((command, context) =>
258+ // {
259+ // commandHandledList.Add((command, context.HandlingKernel));
260+ // return Task.CompletedTask;
261+ // }, childKernel.Name);
262+
263+ // scheduler.DeferCommand(deferredCommand1, childKernel);
264+ // scheduler.DeferCommand(deferredCommand2, parentKernel);
265+ // scheduler.DeferCommand(deferredCommand3, childKernel);
266+ // await scheduler.Schedule(command1, childKernel);
267+
268+ // commandHandledList.Select(e => e.command).Should().BeEquivalentSequenceTo(deferredCommand1, deferredCommand2, deferredCommand3, command1);
269+
270+ // commandHandledList.Select(e => e.kernel).Should().BeEquivalentSequenceTo(childKernel, parentKernel, childKernel, childKernel);
271+ //}
212272 }
213- }
273+ }
0 commit comments