Example #1
0
        public Task <AssignableTypesResult> GetAssignableTypesAsync(ITypeInfo type, bool childTypes)
        {
            if (type == KnownTypes[typeof(CommonValueConverter)])
            {
                return(Task.FromResult(new AssignableTypesResult(new[] { type })));
            }

            return(Task.Run(() => {
                var types = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()).AsParallel()
                            .Where(t => t.Namespace != null && !t.IsAbstract && !t.IsInterface && t.IsPublic && t.GetConstructor(Type.EmptyTypes) != null);

                Type realType = ReflectionEditorProvider.GetRealType(type);
                if (childTypes)
                {
                    var generic = realType.GetInterface("ICollection`1");
                    if (generic != null)
                    {
                        realType = generic.GetGenericArguments()[0];
                    }
                    else
                    {
                        realType = typeof(object);
                    }
                }

                types = types.Where(t => realType.IsAssignableFrom(t));

                return new AssignableTypesResult(types.Select(t => {
                    string asmName = t.Assembly.GetName().Name;
                    return new TypeInfo(new AssemblyInfo(asmName, isRelevant: asmName.StartsWith("Xamarin")), t.Namespace, t.Name);
                }).ToList());
            }));
        }
        public async Task PropertyChanged()
        {
            var obj = new TestClass();

            var           provider = new ReflectionEditorProvider();
            IObjectEditor editor   = await provider.GetObjectEditorAsync(obj);

            const string value    = "value";
            var          property = editor.Properties.Single();

            bool changed = false;

            editor.PropertyChanged += (sender, args) => {
                if (Equals(args.Property, property))
                {
                    changed = true;
                }
            };

            await editor.SetValueAsync(property, new ValueInfo <string> {
                Value = value
            });

            Assert.That(changed, Is.True, "PropertyChanged was not raised for the given property");
        }
Example #3
0
        public async Task PropertyListCategoryFiltered()
        {
            var provider = new ReflectionEditorProvider();
            var obj      = new TestClassSub();
            var editor   = await provider.GetObjectEditorAsync(obj);

            Assume.That(editor.Properties.Count, Is.EqualTo(2));

            var vm = new PanelViewModel(new TargetPlatform(provider))
            {
                ArrangeMode = PropertyArrangeMode.Category
            };

            vm.SelectedObjects.Add(obj);

            Assume.That(vm.ArrangedEditors, Is.Not.Empty);

            vm.FilterText = "sub";
            Assert.That(vm.ArrangedEditors.Count, Is.EqualTo(1));

            var group = vm.ArrangedEditors.FirstOrDefault(g => g.Category == "Sub");

            Assert.That(group, Is.Not.Null);
            Assert.That(group.Editors.Count, Is.EqualTo(1));
        }
        public async Task CombinableEnum()
        {
            var enumObj = new EnumClass();

            var           provider = new ReflectionEditorProvider();
            IObjectEditor editor   = await provider.GetObjectEditorAsync(enumObj);

            List <int> values = new List <int> ();

            values.Add((int)FlagsTestEnum.Flag1);
            values.Add((int)FlagsTestEnum.Flag3);

            FlagsTestEnum expected = FlagsTestEnum.Flag1 | FlagsTestEnum.Flag3;

            await editor.SetValueAsync(editor.Properties.First(), new ValueInfo <IReadOnlyList <int> > {
                Value = values
            });

            ValueInfo <int> underlying = await editor.GetValueAsync <int> (editor.Properties.First());

            Assert.That((FlagsTestEnum)underlying.Value, Is.EqualTo(expected));

            ValueInfo <IReadOnlyList <int> > underlyingList = await editor.GetValueAsync <IReadOnlyList <int> > (editor.Properties.First());

            Assert.That(underlyingList.Value, Contains.Item((int)FlagsTestEnum.Flag1));
            Assert.That(underlyingList.Value, Contains.Item((int)FlagsTestEnum.Flag3));
        }
Example #5
0
        public async Task <IReadOnlyCollection <IPropertyInfo> > GetPropertiesForTypeAsync(ITypeInfo type)
        {
            Type realType = ReflectionEditorProvider.GetRealType(type);

            if (realType == null)
            {
                return(Array.Empty <IPropertyInfo>());
            }
            return(ReflectionEditorProvider.GetPropertiesForType(realType));
        }
        public async Task DontSetupPropertiesMarkedUnbrowsable()
        {
            var unbrowsable = new Unbrowsable();

            var           provider = new ReflectionEditorProvider();
            IObjectEditor editor   = await provider.GetObjectEditorAsync(unbrowsable);

            Assert.That(editor.Properties.Count, Is.EqualTo(1), "Wrong number of properties");
            Assert.That(editor.Properties.Single().Name, Is.EqualTo(nameof(Unbrowsable.VisibleProperty)));
        }
Example #7
0
        public void TypeName()
        {
            var provider = new ReflectionEditorProvider();
            var obj      = new TestClassSub();

            var vm = CreateVm(provider);

            Assume.That(vm.TypeName, Is.Null);

            vm.SelectedObjects.Add(obj);

            Assert.That(vm.TypeName, Is.EqualTo(nameof(TestClassSub)));
        }
        public async Task EditorHasSimpleProperty()
        {
            var           provider = new ReflectionEditorProvider();
            IObjectEditor editor   = await provider.GetObjectEditorAsync(new TestClass());

            Assume.That(editor, Is.Not.Null);

            Assert.That(editor.Properties.Count, Is.EqualTo(1));

            var property = editor.Properties.Single();

            Assert.That(property.Name, Is.EqualTo(nameof(TestClass.Property)));
            Assert.That(property.Type, Is.EqualTo(typeof(string)));
        }
Example #9
0
        public async Task PropertiesAddedFromEditor()
        {
            var provider = new ReflectionEditorProvider();
            var obj      = new TestClass();
            var editor   = await provider.GetObjectEditorAsync(obj);

            Assume.That(editor.Properties.Count, Is.EqualTo(1));

            var vm = new PanelViewModel(provider, TargetPlatform.Default);

            vm.SelectedObjects.Add(obj);

            Assert.That(vm.Properties, Is.Not.Empty);
            Assert.That(((PropertyViewModel)vm.Properties[0]).Property, Is.EqualTo(editor.Properties.Single()));
        }
        public async Task GetValueConvert()
        {
            const string value = "1";
            var          obj   = new TestClass {
                Property = value
            };

            var           provider = new ReflectionEditorProvider();
            IObjectEditor editor   = await provider.GetObjectEditorAsync(obj);

            ValueInfo <int> info = await editor.GetValueAsync <int> (editor.Properties.Single());

            Assert.That(info.Value, Is.EqualTo(1));
            Assert.That(info.Source, Is.EqualTo(ValueSource.Local));
        }
        public async Task SetValueConvert()
        {
            var obj = new TestClass();

            var           provider = new ReflectionEditorProvider();
            IObjectEditor editor   = await provider.GetObjectEditorAsync(obj);

            const string value = "1";

            await editor.SetValueAsync(editor.Properties.Single(), new ValueInfo <int> {
                Value = 1
            });

            Assert.That(obj.Property, Is.EqualTo(value));
        }
Example #12
0
        public async Task PropertyCategoryArrange()
        {
            var provider = new ReflectionEditorProvider();
            var obj      = new TestClassSub();
            var editor   = await provider.GetObjectEditorAsync(obj);

            Assume.That(editor.Properties.Count, Is.EqualTo(2));

            var vm = new PanelViewModel(provider, TargetPlatform.Default)
            {
                ArrangeMode = PropertyArrangeMode.Category
            };

            vm.SelectedObjects.Add(obj);

            Assume.That(vm.ArrangedEditors, Is.Not.Empty);
            Assert.That(vm.ArrangedEditors.FirstOrDefault(g => g.Key == "Sub"), Is.Not.Null);
        }
        public async Task TypeConvertFromPropertyAttribute()
        {
            const string value = "value";
            var          obj   = new ConversionClass2();

            var           provider = new ReflectionEditorProvider();
            IObjectEditor editor   = await provider.GetObjectEditorAsync(obj);

            Assume.That(editor.Properties.Count, Is.EqualTo(1));

            await editor.SetValueAsync(editor.Properties.Single(), new ValueInfo <string> {
                Value  = value,
                Source = ValueSource.Local
            });

            Assert.That(obj.Property, Is.Not.Null);
            Assert.That(obj.Property.Property, Is.EqualTo(value));
        }
Example #14
0
        public async Task PropertyListFilteredTextReducesList()
        {
            var provider = new ReflectionEditorProvider();
            var obj      = new TestClassSub();
            var editor   = await provider.GetObjectEditorAsync(obj);

            Assume.That(editor.Properties.Count, Is.EqualTo(2));

            var vm = new PanelViewModel(new TargetPlatform(provider));

            Assume.That(vm.ArrangeMode, Is.EqualTo(PropertyArrangeMode.Name));
            vm.SelectedObjects.Add(obj);

            Assume.That(vm.ArrangedEditors, Is.Not.Empty);
            Assume.That(vm.ArrangedEditors[0].Editors.Count, Is.EqualTo(2));

            vm.FilterText = "sub";
            Assert.That(vm.ArrangedEditors[0].Editors.Count, Is.EqualTo(1));
        }
Example #15
0
        public async Task AutoExpand()
        {
            var provider = new ReflectionEditorProvider();
            var obj      = new TestClassSub();
            var editor   = await provider.GetObjectEditorAsync(obj);

            Assume.That(editor.Properties.Count, Is.EqualTo(2));

            var vm = new PanelViewModel(new TargetPlatform(provider))
            {
                ArrangeMode = PropertyArrangeMode.Category,
                AutoExpand  = true
            };

            vm.SelectedObjects.Add(obj);

            Assume.That(vm.ArrangedEditors, Is.Not.Empty);
            Assert.That(vm.GetIsExpanded(vm.ArrangedEditors[0].Category), Is.True);
        }
        public async Task <IReadOnlyCollection <IPropertyInfo> > GetPropertiesForTypeAsync(ITypeInfo type)
        {
            Type realType = ReflectionEditorProvider.GetRealType(type);

            if (realType == null)
            {
                return(Array.Empty <IPropertyInfo> ());
            }

            if (typeof(MockControl).IsAssignableFrom(realType))
            {
                object item = await CreateObjectAsync(type);

                IObjectEditor editor = ChooseEditor(item);
                return(editor.Properties);
            }

            return(ReflectionEditorProvider.GetPropertiesForType(realType));
        }
        public async Task TypeConverterToPropertyAttribute()
        {
            const string value = "value";
            var          obj   = new ConversionClass2 {
                Property = new TestClass2 {
                    Property = value
                }
            };

            var           provider = new ReflectionEditorProvider();
            IObjectEditor editor   = await provider.GetObjectEditorAsync(obj);

            Assume.That(editor.Properties.Count, Is.EqualTo(1));

            ValueInfo <string> info = await editor.GetValueAsync <string> (editor.Properties.Single());

            Assert.That(info.Value, Is.EqualTo(value));
            Assert.That(info.Source, Is.EqualTo(ValueSource.Local));
        }
Example #18
0
        public void EditorRemovedWithSelectedObject()
        {
            var provider = new ReflectionEditorProvider();

            var obj1 = new TestClass();
            var obj2 = new TestClass();

            var vm = new PanelViewModel(provider, TargetPlatform.Default);

            vm.SelectedObjects.Add(obj1);
            vm.SelectedObjects.Add(obj2);

            var property = vm.Properties[0];
            var editor   = property.Editors.Single(oe => oe.Target == obj1);

            Assume.That(property.Editors.Count, Is.EqualTo(2));
            Assume.That(vm.SelectedObjects.Remove(obj2));
            Assume.That(property, Is.SameAs(vm.Properties[0]));
            Assert.That(property.Editors, Contains.Item(editor));
            Assert.That(property.Editors.Count, Is.EqualTo(1));
        }
Example #19
0
        public async Task ResourceProperties()
        {
            object target    = new object();
            var    property  = GetBasicProperty();
            var    editor    = GetBasicEditor(target, property.Object);
            var    resources = new MockResourceProvider();
            var    source    = new BindingSource("Resources", BindingSourceType.Resource);
            var    bindings  = GetBasicBindingProvider(target, property.Object, sources: new [] { source });

            bindings.Setup(bp => bp.GetResourcesAsync(source, target))
            .Returns <BindingSource, object> (async(bs, t) => {
                var rs = await resources.GetResourcesAsync(target, CancellationToken.None);
                return(rs.ToLookup(r => r.Source));
            });

            var vm = new CreateBindingViewModel(
                new TargetPlatform(new MockEditorProvider(editor.Object), resources, bindings.Object), editor.Object,
                property.Object);

            Assume.That(vm.SelectedBindingSource, Is.EqualTo(source));
            Assume.That(vm.SourceResources, Is.Not.Null);
            await vm.SourceResources.Task;

            while (vm.SelectedObjects.Count == 0)
            {
                await Task.Delay(1);
            }

            var binding = (MockBinding)vm.SelectedObjects.First();

            vm.SelectedResource = vm.SourceResources.Value.First().OfType <Resource <CommonSolidBrush> >().First();
            Assert.That(binding.SourceParameter, Is.EqualTo(vm.SelectedResource));
            Assume.That(vm.PropertyRoot, Is.Not.Null);
            await vm.PropertyRoot.Task;

            Assert.That(vm.PropertyRoot.Value.TargetType, Is.EqualTo(typeof(CommonSolidBrush).ToTypeInfo()));
            CollectionAssert.AreEqual(ReflectionEditorProvider.GetPropertiesForType(typeof(CommonSolidBrush)),
                                      vm.PropertyRoot.Value.Children.Select(pe => pe.Property));
        }
Example #20
0
        public async Task PropertyListIsFiltered()
        {
            var provider = new ReflectionEditorProvider();
            var obj      = new TestClassSub();
            var editor   = await provider.GetObjectEditorAsync(obj);

            Assume.That(editor.Properties.Count, Is.EqualTo(2));

            var vm = new PanelViewModel(new TargetPlatform(provider));

            Assume.That(vm.ArrangeMode, Is.EqualTo(PropertyArrangeMode.Name));
            vm.SelectedObjects.Add(obj);

            Assume.That(vm.ArrangedEditors, Is.Not.Empty);
            Assume.That(vm.ArrangedEditors[0].Editors.Count, Is.EqualTo(2));

            Assume.That(vm.IsFiltering, Is.False);
            bool changed = false;

            vm.PropertyChanged += (sender, args) => {
                if (args.PropertyName == nameof(PanelViewModel.IsFiltering))
                {
                    changed = true;
                }
            };

            vm.FilterText = "sub";
            Assume.That(vm.ArrangedEditors[0].Editors.Count, Is.EqualTo(1));
            Assert.That(vm.IsFiltering, Is.True);
            Assert.That(changed, Is.True);
            changed = false;

            vm.FilterText = null;
            Assert.That(vm.IsFiltering, Is.False);
            Assert.That(changed, Is.True);
        }