Example #1
0
        public static void test_constructor_with_callback()
        {
            bool callbackCalled = false;

            eina.Value received_value = null;

            efl.ILoop    loop    = efl.App.GetLoopMain();
            eina.Promise promise = new eina.Promise();
#pragma warning disable 0219
            eina.Future future = new eina.Future(promise, (eina.Value value) => {
                callbackCalled = true;
                received_value = value;
                return(value);
            });
#pragma warning restore 0219

            eina.Value reference_value = new eina.Value(eina.ValueType.Int32);
            reference_value.Set(1984);
            promise.Resolve(reference_value);

            loop.Iterate();

            Test.Assert(callbackCalled, "Future callback should have been called.");
            Test.AssertEquals(received_value, reference_value);
        }
Example #2
0
        public static void test_simple_reject()
        {
            bool callbackCalled = false;

            eina.Error received_error = eina.Error.NO_ERROR;

            efl.ILoop    loop    = efl.App.GetLoopMain();
            eina.Promise promise = new eina.Promise();
            eina.Future  future  = new eina.Future(promise);

            future = future.Then((eina.Value value) => {
                callbackCalled = true;
                value.Get(out received_error);
                return(value);
            });

            promise.Reject(eina.Error.EPERM);

            loop.Iterate();

            Test.Assert(callbackCalled, "Future callback should have been called.");
            Test.AssertEquals(received_error, eina.Error.EPERM);

            Test.AssertRaises <ObjectDisposedException>(() => { promise.Resolve(null); });
            Test.AssertRaises <ObjectDisposedException>(future.Cancel);
        }
Example #3
0
        public static void test_simple_task_run()
        {
            efl.ILoop   loop   = efl.App.GetLoopMain();
            eina.Future future = loop.Idle();

            bool callbackCalled = false;
            int  ret_code       = 1992;

            future.Then((eina.Value value) => {
                callbackCalled = true;
                eina.Value v   = new eina.Value(eina.ValueType.Int32);
                v.Set(ret_code);
                loop.Quit(v);
                return(value);
            });
            eina.Value ret_value = loop.Begin();

            Test.Assert(callbackCalled, "Future loop callback must have been called.");

            Test.AssertEquals(ret_value.GetValueType(), eina.ValueType.Int32);

            int ret_from_value;

            Test.Assert(ret_value.Get(out ret_from_value));
            Test.AssertEquals(ret_from_value, ret_code);
        }
Example #4
0
        public static void test_simple_resolve()
        {
            bool callbackCalled = false;

            eina.Value received_value = null;

            efl.ILoop    loop    = efl.App.GetLoopMain();
            eina.Promise promise = new eina.Promise();
            eina.Future  future  = new eina.Future(promise);

            future = future.Then((eina.Value value) => {
                callbackCalled = true;
                received_value = value;
                return(value);
            });

            eina.Value reference_value = new eina.Value(eina.ValueType.Int32);
            reference_value.Set(1984);
            promise.Resolve(reference_value);

            loop.Iterate();

            Test.Assert(callbackCalled, "Future callback should have been called.");
            Test.AssertEquals(received_value, reference_value);
        }
Example #5
0
        public static async Task Consume(efl.ILoop loop)
        {
            Task <eina.Value> task = loop.IdleAsync();

            eina.Value v = await task;
            loop.Quit(v);
        }
Example #6
0
        public static void test_object_promise()
        {
            efl.ILoop    loop = efl.App.GetLoopMain();
            test.Testing obj  = new test.Testing();

            eina.Future future = obj.GetFuture();

            bool callbackCalled = false;
            int  receivedValue  = -1;
            int  sentValue      = 1984;

            future.Then((eina.Value value) => {
                callbackCalled = true;
                Test.AssertEquals(value.GetValueType(), eina.ValueType.Int32);
                value.Get(out receivedValue);

                return(value);
            });

            obj.FulfillPromise(sentValue);

            loop.Iterate();
            Test.Assert(callbackCalled, "Future callback must have been called.");
            Test.AssertEquals(receivedValue, sentValue);
        }
Example #7
0
        public static void test_object_promise_cancel()
        {
            efl.ILoop    loop = efl.App.GetLoopMain();
            test.Testing obj  = new test.Testing();

            eina.Future future = obj.GetFuture();

            bool callbackCalled = false;

            eina.Error receivedError = -1;
            eina.Error sentError     = 120;
            future.Then((eina.Value value) => {
                callbackCalled = true;
                Test.AssertEquals(value.GetValueType(), eina.ValueType.Error);
                value.Get(out receivedError);

                return(value);
            });

            obj.RejectPromise(sentError);

            loop.Iterate();
            Test.Assert(callbackCalled, "Future callback must have been called.");
            Test.AssertEquals(receivedError, sentError);
        }
Example #8
0
        public static void test_async_reject()
        {
            efl.ILoop     loop = efl.App.GetLoopMain();
            test.ITesting obj  = new test.Testing();

            Task <eina.Value> task = obj.GetFutureAsync();

            eina.Error sentError = 1337;
            obj.RejectPromise(sentError);

            loop.Iterate();

            bool raised = false;

            try
            {
                eina.Value v = task.Result;
            }
            catch (AggregateException ae)
            {
                raised = true;
                ae.Handle((x) =>
                {
                    Test.Assert(x is efl.FutureException, "AggregateException must have been TaskCanceledException");
                    efl.FutureException ex = x as efl.FutureException;
                    Test.AssertEquals(ex.Error, sentError);
                    return(true);
                });
            }

            Test.Assert(raised, "AggregateException must have been raised.");
        }
Example #9
0
        public static void test_async_cancel()
        {
            efl.ILoop     loop = efl.App.GetLoopMain();
            test.ITesting obj  = new test.Testing();

            CancellationTokenSource cancelSrc = new CancellationTokenSource();
            Task <eina.Value>       task      = obj.GetFutureAsync(cancelSrc.Token);

            cancelSrc.Cancel();
            loop.Iterate();

            bool raised = false;

            try
            {
                eina.Value v = task.Result;
            }
            catch (AggregateException ae)
            {
                raised = true;
                ae.Handle((x) =>
                {
                    Test.Assert(x is TaskCanceledException, "AggregateException must have been TaskCanceledException");
                    return(true);
                });
            }

            Test.Assert(raised, "AggregateException must have been raised.");
        }
Example #10
0
        public static void test_simple_async()
        {
            efl.ILoop loop = efl.App.GetLoopMain();
            Task      t    = LoopConsumer.Consume(loop);

            loop.Begin();
            Test.Assert(t.Wait(1000), "Task should have been completed in time.");
        }
Example #11
0
        public static void test_then_chain_array()
        {
            bool[]       callbacksCalled = { false, false, false, false };
            eina.Value[] received_value  = { null, null, null, null };

            FutureCbGenerator genResolvedCb = (int i) => {
                return((eina.Value value) => {
                    callbacksCalled[i] = true;
                    int x;
                    value.Get(out x);
                    value.Set(x + i);
                    received_value[i] = value;
                    return value;
                });
            };

            var cbs = new List <eina.Future.ResolvedCb>();

            for (int i = 0; i < 4; i++)
            {
                cbs.Add(genResolvedCb(i));
            }

            efl.ILoop    loop    = efl.App.GetLoopMain();
            eina.Promise promise = new eina.Promise();
            eina.Future  future  = new eina.Future(promise);
            future = future.Chain(cbs);

            eina.Value reference_value = new eina.Value(eina.ValueType.Int32);
            reference_value.Set(0);
            promise.Resolve(reference_value);

            loop.Iterate();

            int current_value = 0;

            for (int i = 0; i < 4; i++)
            {
                current_value += i;
                Test.Assert(callbacksCalled[i], $"Future chained callback {i} should have been called.");
                int received;
                received_value[i].Get(out received);
                Test.AssertEquals(received, current_value);
            }

            Test.AssertRaises <ObjectDisposedException>(() => { promise.Resolve(null); });
            Test.AssertRaises <ObjectDisposedException>(future.Cancel);
        }
Example #12
0
        public static void test_async_fulfill()
        {
            efl.ILoop     loop = efl.App.GetLoopMain();
            test.ITesting obj  = new test.Testing();

            Task <eina.Value> task = obj.GetFutureAsync();

            int sentValue = 1337;

            obj.FulfillPromise(sentValue);
            loop.Iterate();

            eina.Value v = task.Result;
            Test.AssertEquals(v.GetValueType(), eina.ValueType.Int32);

            int receivedValue;

            v.Get(out receivedValue);
            Test.AssertEquals(receivedValue, sentValue);
        }
Example #13
0
        /// <summary>
        /// Creates a new Promise with the given callback.
        ///
        /// Currently, creating a promise directly uses the Main Loop scheduler the source of notifications (i.e. the
        /// future callbacks will be called mainly from a loop iteration).
        /// </summary>
        public Promise(CancelCb cancelCb = null)
        {
            efl.ILoop loop = efl.App.GetLoopMain();

            // Should we be able to pass different schedulers?
            IntPtr scheduler = efl_loop_future_scheduler_get(loop.raw_handle);

            IntPtr cb_data = IntPtr.Zero;

            // A safety clean callback to mark this wrapper as invalid
            CancelCb safetyCb = () => {
                Handle = IntPtr.Zero;
                if (cancelCb != null)
                {
                    cancelCb();
                }
            };

            CleanupHandle = GCHandle.Alloc(safetyCb);
            cb_data       = GCHandle.ToIntPtr(CleanupHandle);

            this.Handle = eina_promise_new(scheduler, NativeCancelCb, cb_data);
        }