public void Font()
        {
            var fontSvc = Substitute.For <IUIHostLocale2>();
            var logFont = new UIDLGLOGFONT[1];

            logFont[0].lfItalic = 1;

            fontSvc.When(x => x.GetDialogFont(Arg.Any <UIDLGLOGFONT[]>())).Do(x => {
                var fontName     = "Arial";
                var lf           = x.Args()[0] as UIDLGLOGFONT[];
                lf[0].lfItalic   = 1;
                lf[0].lfHeight   = 16;
                lf[0].lfFaceName = new ushort[fontName.Length];
                int i            = 0;
                foreach (var ch in fontName)
                {
                    lf[0].lfFaceName[i++] = (ushort)ch;
                }
            });
            fontSvc.GetDialogFont(Arg.Any <UIDLGLOGFONT[]>()).Returns(VSConstants.S_OK);

            var shell = Substitute.For <ICoreShell>();

            shell.GetService <IUIHostLocale2>(typeof(SUIHostLocale)).Returns(fontSvc);

            var control = new SettingsPageControl(_csp, shell, _fs);

            control.CreateControl();
            control.Font.Italic.Should().BeTrue();
            control.Font.Name.Should().Be("Arial");
        }
        public async Task PropertyGridSingle()
        {
            var fs = Substitute.For <IFileSystem>();
            var up = Substitute.For <UnconfiguredProject>();

            up.FullPath.Returns(Path.Combine(_files.DestinationPath, "file.rproj"));

            var control = new SettingsPageControl(_csp, _shell, fs);

            var fileName = "PropertyGridSingle.settings.r";
            var file     = Path.Combine(_files.DestinationPath, fileName);

            fs.GetFileSystemEntries(Arg.Any <string>(), Arg.Any <string>(), SearchOption.AllDirectories).Returns(new string[] { file });

            await control.SetProjectAsync(up, _properties);

            control.CreateControl();
            control.FileListCombo.Items.Count.Should().BeGreaterThan(0);
            control.FileListCombo.Items.Should().Contain("~/" + fileName);

            control.PropertyGrid.SelectedObject.Should().NotBeNull();

            var desc = control.PropertyGrid.SelectedObject as SettingsTypeDescriptor;

            desc.Should().NotBeNull();
            desc.GetProperties().Should().HaveCount(1);

            var prop = desc.GetProperties()[0] as SettingPropertyDescriptor;

            prop.Should().NotBeNull();
            prop.Setting.Name.Should().Be("x");
            prop.Setting.Value.Should().Be("1");
            prop.Setting.ValueType.Should().Be(ConfigurationSettingValueType.Expression);
        }
        public async Task PropertyGridMultiple02()
        {
            var shell = Substitute.For <ICoreShell>();
            var fs    = Substitute.For <IFileSystem>();
            var up    = Substitute.For <UnconfiguredProject>();

            up.FullPath.Returns(Path.Combine(_files.DestinationPath, "file.rproj"));

            var control = new SettingsPageControl(_csp, shell, fs);

            var fileName1 = "PropertyGridMultiple02-1.Settings.R";
            var file1     = Path.Combine(_files.DestinationPath, fileName1);
            var fileName2 = "PropertyGridMultiple02-2.Settings.R";
            var file2     = Path.Combine(_files.DestinationPath, fileName2);

            fs.GetFileSystemEntries(Arg.Any <string>(), Arg.Any <string>(), SearchOption.AllDirectories).Returns(new string[] { file1, file2 });

            await control.SetProjectAsync(up, _properties);

            control.CreateControl();
            control.FileListCombo.Items.Count.Should().BeGreaterThan(0);
            control.FileListCombo.Items.Should().Contain("~/" + fileName1);
            control.FileListCombo.Items.Should().Contain("~/" + fileName2);

            control.PropertyGrid.SelectedObject.Should().NotBeNull();
            var desc = control.PropertyGrid.SelectedObject as SettingsTypeDescriptor;

            desc.Should().NotBeNull();
            desc.GetProperties().Should().HaveCount(1);

            var prop = desc.GetProperties()[0] as SettingPropertyDescriptor;

            prop.Should().NotBeNull();
            prop.SetValue(null, "42");
            prop.Setting.Value.Should().Be("42");

            var pg = control.PropertyGrid;
            var mi = pg.GetType().GetMethod("OnPropertyValueChanged", BindingFlags.Instance | BindingFlags.NonPublic);

            mi.Invoke(pg, new object[] { new PropertyValueChangedEventArgs(pg.SelectedGridItem, "1") });

            control.IsDirty.Should().BeTrue();

            var uis = shell.UI();

            uis.ShowMessage(Resources.SettingsPage_SavePrompt, MessageButtons.YesNoCancel).Returns(MessageButtons.Yes);
            control.FileListCombo.SelectedIndex = 1;
            uis.Received().ShowMessage(Resources.SettingsPage_SavePrompt, MessageButtons.YesNoCancel);

            control.IsDirty.Should().BeTrue(); // Changing between setting files makes page dirty
            control.FileListCombo.SelectedIndex.Should().Be(1);
        }
        public void Construction()
        {
            var control = new SettingsPageControl(_csp, _shell, _fs);

            control.IsDirty.Should().BeFalse();
            control.CreateControl();

            control.FileListCombo.Items.Count.Should().Be(1);
            control.FileListCombo.Items[0].Should().Be(Resources.NoSettingFiles);

            control.VariableName.Text.Should().BeNullOrEmpty();
            control.VariableValue.Text.Should().BeNullOrEmpty();
            control.VariableTypeCombo.Items.Should().HaveCount(2);
            control.AddButton.Enabled.Should().BeFalse();
        }
        public async Task DirtyState()
        {
            var control = new SettingsPageControl(_csp, _shell, _fs);
            int count   = 0;

            control.DirtyStateChanged += (s, e) => {
                count++;
            };
            control.IsDirty = true;
            control.IsDirty.Should().BeTrue();
            count.Should().Be(1);

            await control.SetProjectAsync(_unconfiguredProject, _properties);

            (await control.SaveSettingsAsync()).Should().BeTrue();
            control.IsDirty.Should().BeFalse();
        }
        public async Task AddVariable()
        {
            var control = new SettingsPageControl(_csp, _shell, _fs);

            await control.SetProjectAsync(_unconfiguredProject, _properties);

            control.CreateControl();

            control.PropertyGrid.SelectedObject.Should().BeNull();

            control.AddButton.Enabled.Should().BeFalse();
            control.VariableName.Text = "x";
            control.AddButton.Enabled.Should().BeFalse();
            control.VariableValue.Text = " ";
            control.AddButton.Enabled.Should().BeFalse();
            control.VariableValue.Text = "1";
            control.AddButton.Enabled.Should().BeTrue();
            control.VariableName.Text = " ";
            control.AddButton.Enabled.Should().BeFalse();

            control.VariableName.Text = "x";
            control.AddButton.Enabled.Should().BeTrue();
            control.AddButton.PerformClick();

            var desc = control.PropertyGrid.SelectedObject as SettingsTypeDescriptor;

            desc.Should().NotBeNull();
            desc.GetProperties().Should().HaveCount(1);

            var prop = desc.GetProperties()[0] as SettingPropertyDescriptor;

            prop.Should().NotBeNull();
            prop.Setting.Name.Should().Be("x");
            prop.Setting.Value.Should().Be("1");
            prop.Setting.ValueType.Should().Be(ConfigurationSettingValueType.String);
        }