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); }
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); }