예제 #1
0
        protected Mock <IEditorWrapperViewModel> SetupEditableWrapper(bool result,
                                                                      Action <IViewModel> wrapCallback = null)
        {
            var wrapper = new Mock <IEditorWrapperViewModel>();

            WrapperManagerMock
            .Setup(provider => provider.Wrap(It.IsAny <IViewModel>(), typeof(IEditorWrapperViewModel), It.IsAny <IDataContext>()))
            .Returns <IViewModel, Type, IDataContext>((vm, t, context) =>
            {
                if (wrapCallback != null)
                {
                    wrapCallback(vm);
                }
                return(wrapper.Object);
            });
            var operation = new NavigationOperation();

            operation.SetResult(OperationResult.CreateResult(OperationType.PageNavigation, wrapper, result));
            ViewModelPresenterMock.Setup(presenter => presenter.ShowAsync(wrapper.Object, It.IsAny <IDataContext>()))
            .Returns(() => operation);
            return(wrapper);
        }
예제 #2
0
            public bool Restore(Type targetType, object target, Dictionary <Type, object> items, ICollection <IViewModel> viewModels, string awaiterResultType, IOperationResult result)
            {
                var field = targetType.GetFieldEx(Name, MemberFlags.NonPublic | MemberFlags.Public | MemberFlags.Instance);

                if (field == null)
                {
                    TraceError(null, targetType);
                    return(false);
                }
                switch (FieldType)
                {
                case BuilderField:
                    var type         = Type.GetType(TypeName, true);
                    var createMethod = type.GetMethodEx("Create", MemberFlags.NonPublic | MemberFlags.Public | MemberFlags.Static);
                    var startMethod  = type.GetMethodEx("Start", MemberFlags.NonPublic | MemberFlags.Public | MemberFlags.Instance);
                    if (createMethod == null || startMethod == null || !startMethod.IsGenericMethodDefinition)
                    {
                        ((IAsyncStateMachine)target).MoveNext();
                        return(true);
                    }
                    var builder = createMethod.Invoke(null, Empty.Array <object>());
                    field.SetValueEx(target, builder);
                    startMethod.MakeGenericMethod(typeof(IAsyncStateMachine))
                    .Invoke(builder, new[] { target });
                    break;

                case AwaiterField:
                    var awaiterType = typeof(SerializableAwaiter <>).MakeGenericType(Type.GetType(awaiterResultType, true));
                    var instance    = Activator.CreateInstance(awaiterType, result);
                    field.SetValueEx(target, instance);
                    break;

                case AsyncOperationField:
                    var opType     = typeof(AsyncOperation <>).MakeGenericType(Type.GetType(awaiterResultType, true));
                    var opInstance = (IAsyncOperation)Activator.CreateInstance(opType);
                    AsyncOperation <object> .TrySetResult(opInstance, result);

                    field.SetValueEx(target, opInstance);
                    break;

                case AnonymousClass:
                    var    anonType = Type.GetType(TypeName, true);
                    object anonClass;
                    if (!items.TryGetValue(anonType, out anonClass))
                    {
                        anonClass = ServiceProvider.GetOrCreate(anonType);
                        foreach (var snapshot in Snapshots)
                        {
                            snapshot.Restore(anonType, anonClass, items, viewModels, awaiterResultType, result);
                        }
                        items[anonType] = anonClass;
                    }
                    field.SetValueEx(target, anonClass);
                    break;

                case NavigationOperationField:
                    var operation = new NavigationOperation();
                    operation.SetResult(OperationResult.Convert <bool>(result));
                    field.SetValueEx(target, operation);
                    break;

                case NonSerializableField:
                    object service;
                    if (State == null)
                    {
                        var serviceType = Type.GetType(TypeName, true);
                        if (!items.TryGetValue(serviceType, out service))
                        {
                            if (field.Name.Contains("CachedAnonymousMethodDelegate"))
                            {
                                service = field.GetValueEx <object>(target);
                            }
                            else if (!ServiceProvider.TryGet(serviceType, out service))
                            {
                                service = field.GetValueEx <object>(target);
                                TraceError(field, targetType);
                            }
                            items[serviceType] = service;
                        }
                    }
                    else
                    {
                        var restoreValueState = ApplicationSettings.RestoreValueState;
                        service = restoreValueState == null ? State : restoreValueState(State, items, viewModels);
                    }
                    field.SetValueEx(target, service);
                    break;

                case SerializableField:
                    field.SetValueEx(target, IsType ? Type.GetType((string)State, false) : State);
                    break;

                case ViewModelField:
                    var viewModel = FindViewModel(viewModels);
                    if (viewModel == null)
                    {
                        TraceError(field, targetType);
                        return(false);
                    }
                    field.SetValueEx(target, viewModel);
                    break;
                }
                return(true);
            }