public void RemoveProfileTest()
        {
            var project = CreateTestProject();
            var context = new ProfileOptionsWindowContext(project, null, null);

            // a crude emulation of WPF control behavior when removing selected profile
            context.DirtyProfiles.CollectionChanged += (s, e) =>
            {
                if (e.Action == NotifyCollectionChangedAction.Remove && e.OldItems[0] == context.SelectedProfile)
                {
                    context.SelectedProfile = null;
                }
            };

            context.SelectedProfile = GetDirtyProfile(context, "kana");
            context.RemoveSelectedProfile();

            Assert.Single(context.DirtyProfiles);
            Assert.Null(context.SelectedProfile);
            Assert.Null(context.SelectedPage);
            Assert.Empty(context.Pages);

            context.SaveChanges();

            Assert.Equal(1, project.Options.Profiles.Count);
            // Switches to the first existing profile
            Assert.Equal("asa", project.Options.ActiveProfile);

            context.SelectedProfile = GetDirtyProfile(context, "asa");
            context.RemoveSelectedProfile();

            Assert.Empty(context.DirtyProfiles);
            Assert.Null(context.SelectedProfile);
            Assert.Null(context.SelectedPage);
            Assert.Empty(context.Pages);

            context.SaveChanges();

            Assert.Null(project.Options.Profile);
            Assert.False(project.Options.HasProfiles);

            // Does not fail when there are no profiles
            context.RemoveSelectedProfile();
        }
        public void ImportExportTest()
        {
            var project = CreateTestProject();
            var context = new ProfileOptionsWindowContext(project, null, null);

            var tmpFile = Path.GetTempFileName();

            context.ExportProfiles(tmpFile);

            context.SelectedProfile = GetDirtyProfile(context, "kana");
            context.RemoveSelectedProfile();
            context.SelectedProfile = GetDirtyProfile(context, "asa");
            context.RemoveSelectedProfile();
            Assert.Empty(context.ProfileNames);

            context.ImportProfiles(tmpFile);
            File.Delete(tmpFile);

            Assert.Collection(context.ProfileNames, fst => Assert.Equal("kana", fst), snd => Assert.Equal("asa", snd));
        }
        public void ImportNameConflictTest()
        {
            var project      = CreateTestProject();
            var nameResolver = new Mock <ProfileOptionsWindowContext.AskProfileNameDelegate>(MockBehavior.Strict);
            var context      = new ProfileOptionsWindowContext(project, null, nameResolver.Object);

            var tmpFile = Path.GetTempFileName();

            context.ExportProfiles(tmpFile);

            context.SelectedProfile = GetDirtyProfile(context, "kana");
            context.RemoveSelectedProfile();
            Assert.Single(context.ProfileNames, "asa");

            nameResolver.Setup(n => n("Import", "Profile asa already exists. Enter a new name or leave it as is to overwrite the profile:", It.IsAny <IEnumerable <string> >(), "asa"))
            .Returns("mizu").Verifiable();
            context.ImportProfiles(tmpFile);
            File.Delete(tmpFile);

            nameResolver.Verify();
            Assert.Collection(context.ProfileNames, fst => Assert.Equal("asa", fst), snd => Assert.Equal("kana", snd), trd => Assert.Equal("mizu", trd));
        }