public void PomodoroAllEventsTest()
        {
            var cs = new CherryService();
            var ftp = new FakeTimeProvider { Now = new DateTime(2009, 05, 13) };
            var ps = new PomodoroSensor();
            cs.PluginRepository.RegisterPlugin(ftp);
            cs.PluginRepository.RegisterPlugin(ps);
            cs.PluginRepository.RegisterPlugin(new DatabaseController());
            cs.InitializeCherryServiceEventsAndCommands();
            cs.PluginRepository.TieEvents();
            var eventChecker = new EventFiredChecker(cs);
            eventChecker.WaitFor("Pomodoro Started", "Pomodoro Finishing", "Pomodoro Finished");

            Assert.IsTrue((bool)eventChecker.InvokeCommand("Start Pomodoro", null));

            eventChecker.AssertFired("Pomodoro Started");
            eventChecker.AssertNotFired("Pomodoro Finishing", "Pomodoro Finished");
            ftp.AdvanceMinutes(25);
            Assert.IsTrue((bool)eventChecker.InvokeCommand("Stop Pomodoro", null));
            eventChecker.AssertFired("Pomodoro Finishing", "Pomodoro Finished");

            eventChecker.Reset();

            Assert.IsTrue((bool)eventChecker.InvokeCommand("Start Pomodoro", null));

            eventChecker.AssertFired("Pomodoro Started");
            eventChecker.AssertNotFired("Pomodoro Finishing", "Pomodoro Finished");
            ftp.AdvanceMinutes(25);
            Assert.IsTrue((bool)eventChecker.InvokeCommand("Void Pomodoro", null));
            eventChecker.AssertFired("Pomodoro Finishing", "Pomodoro Finished");
        }
        public void TestCondition()
        {
            var cond = new TimeOfDayCondition()
            {
                StartTime = TimeSpan.FromHours(8),
                EndTime = TimeSpan.FromHours(9),
                ShouldBeWithin = true,
            };

            var checker = new CherryTomato.Reminders.TimeOfDayConditionChecker.TimeOfDayConditionChecker();
            var cs = new CherryService();
            cs.PluginRepository.RegisterPlugin(checker);
            var tp = new FakeTimeProvider();
            cs.PluginRepository.RegisterPlugin(tp);
            cs.InitializeCherryServiceEventsAndCommands();
            cs.PluginRepository.TieEvents();

            tp.Now = DateTime.Today.AddHours(8).AddMinutes(1);
            Assert.IsTrue(checker.IsTrue(cond));

            tp.Now = DateTime.Today.AddHours(9).AddMinutes(1);
            Assert.IsFalse(checker.IsTrue(cond));

            cond.ShouldBeWithin = false;
            Assert.IsTrue(checker.IsTrue(cond));

            tp.Now = DateTime.Today.AddHours(8).AddMinutes(1);
            Assert.IsFalse(checker.IsTrue(cond));
        }
        public void ReadReminderTest()
        {
            using (var cs = new CherryService())
            {
                cs.PluginRepository.RegisterPlugin(new FakeReminderPlugin());
                cs.PluginRepository.RegisterPlugin(new PomodoroSensor());
                cs.PluginRepository.RegisterPlugin(new RemindersCorePlugin());
                cs.PluginRepository.RegisterPlugin(new ReminderPluginsRepository());
                cs.PluginRepository.RegisterPlugin(new FakeTimeProvider());
                cs.PluginRepository.RegisterPlugin(new FakeWindowsController());
                cs.PluginRepository.RegisterPlugin(new DatabaseController());

                var csr = new StringReader("<cherryTomato><config>" +
                    "<reminders><reminder typeName=\"FakeReminder\" /></reminders>" +
                    "</config></cherryTomato>");

                cs.InitializeCherryServiceEventsAndCommands();
                cs.PluginRepository.TieEvents();
                cs.LoadConfiguration(csr);

                var allReminders = cs.PluginRepository.CherryCommands["Get All Reminders"].Do(null)
                    as IEnumerable<IReminder>;
                Assert.That(allReminders.FirstOrDefault().TypeName, Is.EqualTo("FakeReminder"));
            }
        }
        public void LoadConfigTest()
        {
            var dbFile = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\cherrytomato\\database.sqlite";
            var ver = new Version(Application.ProductVersion);
            var configString = "<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n" +
                    "<cherryTomato>\r\n" +
                    "  <hasRun />\r\n" +
                    "  <newestKnownVersion major=\"" + ver.Major + "\" minor=\"" + ver.Minor + "\" />\r\n" +
                    "  <databaseFile path=\"" + dbFile + "\" />\r\n" +
                    "  <config />\r\n" +
                    "</cherryTomato>";

            var reader = new StringReader(configString);
            using (var cs = new CherryService())
            {
                var vc = new VersionChecker();
                cs.PluginRepository.RegisterPlugin(new PomodoroSensor());
                cs.PluginRepository.RegisterPlugin(new FakeTimeProvider());
                cs.PluginRepository.RegisterPlugin(new DatabaseController());
                var fr = new FirstRunSensor();
                cs.PluginRepository.RegisterPlugin(fr);
                cs.PluginRepository.RegisterPlugin(vc);
                cs.InitializeCherryServiceEventsAndCommands();
                cs.PluginRepository.TieEvents();
                cs.LoadConfiguration(reader);
                Assert.AreEqual(true, fr.HasRun);
                Assert.AreEqual(ver.Major, vc.NewestKnownVersion.Major);
                Assert.AreEqual(ver.Minor, vc.NewestKnownVersion.Minor);
            }
        }
        public void PomodoroTest()
        {
            using (var cs = new CherryService())
            {
                var ps = new PomodoroSensor();
                cs.PluginRepository.RegisterPlugin(ps);
                var tp = new FakeTimeProvider();
                cs.PluginRepository.RegisterPlugin(tp);
                cs.PluginRepository.RegisterPlugin(new FakeWindowsController());
                cs.PluginRepository.RegisterPlugin(new FakeSettingsController());
                var ic = new IconController();
                cs.PluginRepository.RegisterPlugin(ic);
                cs.PluginRepository.RegisterPlugin(new DatabaseController());

                var im = new FakeImController();
                cs.PluginRepository.RegisterPlugin(im);

                cs.InitializeCherryServiceEventsAndCommands();
                cs.PluginRepository.TieEvents();

                cs.PluginRepository.CherryCommands["Start Pomodoro"].Do(null);
                ic.UpdateToolTipTextMessage();

                Assert.True(ps.CurrentlyInPomodoro);
                Assert.That(ps.GetCurrentStatusData().Remaining.Minutes, Is.EqualTo(25));
                Assert.That(im.InPomodoro);
                Assert.That(ps.GetCurrentStatusData().MinutesLeft, Is.EqualTo(25));
                Assert.IsTrue(ic.ToolTipText.StartsWith("In pomodoro. 25 minutes left"));

                tp.AdvanceMinutes(3);
                ic.UpdateToolTipTextMessage();
                Assert.True(ps.CurrentlyInPomodoro);
                Assert.That(ps.GetCurrentStatusData().Remaining.Minutes, Is.EqualTo(22));
                Assert.That(ps.GetCurrentStatusData().MinutesLeft, Is.EqualTo(22));
                Assert.IsTrue(ic.ToolTipText.StartsWith("In pomodoro. 22 minutes left"));

                tp.AdvanceMinutes(22);
                ps.StopPomodoroInternal(true);
                Assert.That(ic.ToolTipText, Is.EqualTo("Pomodoro completed"));

                // Poll eniough times to make icon controller stop flashing.
                ic.StopFlashing();

                tp.AdvanceMinutes(10);
                ic.UpdateToolTipTextMessage();
                //Assert.That(cs.GetTimeSinceLastPomodoro().TotalMinutes, Is.EqualTo(10));
                Assert.That(im.InPomodoro, Is.False);
                Assert.IsTrue(ic.ToolTipText.StartsWith("Out of pomodoro for 10 minutes"));

                tp.AdvanceMinutes(59);
                ic.UpdateToolTipTextMessage();
                Assert.IsTrue(ic.ToolTipText.StartsWith("Out of pomodoro for 1 hour"));
            }
        }
        public void LoadConfigTest()
        {
            using (var cs = new CherryService())
            {
                var irp = new IntervalReminderPlugin();
                var configString = "<cherryTomato><config><reminders>" +
                                   "<reminder enabled=\"True\" typeName=\"Interval Reminder\" name=\"name\" fromInterval=\"00:17:00\" toInterval=\"00:18:00\">" +
                                   "<compositeNotification>" +
                                   "<notification typeName=\"IconNotification\" enabled=\"True\" flashIconPath=\"res://pomodoro.ico\" flashCount=\"5\" notificationText=\"notificationtext\" />" +
                                   "<notification typeName=\"SoundNotification\" enabled=\"True\" soundPath=\"spacey.wav\" />" +
                                   "</compositeNotification>" +
                                   "<description>description</description>" +
                                   "</reminder>" +
                                   "</reminders></config></cherryTomato>";

                cs.PluginRepository.RegisterPlugin(new FakeIconController());
                cs.PluginRepository.RegisterPlugin(irp);
                cs.PluginRepository.RegisterPlugin(new CherryTomato.Core.SoundController.SoundController());
                cs.PluginRepository.RegisterPlugin(new CherryTomato.Reminders.SystrayIconNotifier.IconNotifier());
                cs.PluginRepository.RegisterPlugin(new CherryTomato.Reminders.SoundNotifier.SoundNotifier());
                cs.PluginRepository.RegisterPlugin(new NotifyPluginsRepository());
                cs.PluginRepository.RegisterPlugin(new ConditionCheckerPluginsRepository());
                cs.PluginRepository.RegisterPlugin(new FakeTimeProvider());
                cs.PluginRepository.RegisterPlugin(new FakeWindowsController());
                cs.PluginRepository.RegisterPlugin(new PomodoroSensor());
                cs.PluginRepository.RegisterPlugin(new DatabaseController());
                cs.InitializeCherryServiceEventsAndCommands();
                cs.PluginRepository.TieEvents();

                var xd = new XmlDocument();
                xd.LoadXml(configString);
                var reminderElement = (XmlElement)xd.SelectSingleNode("cherryTomato/config/reminders/reminder");
                var ir = (CherryTomato.Reminders.IntervalReminder.IntervalReminder)irp.LoadReminder(reminderElement);
                Assert.That(ir.Name, Is.EqualTo("name"));
                Assert.That(ir.Enabled);
                Assert.That(ir.FromInterval, Is.EqualTo(new TimeSpan(0, 0, 17, 0)));
                Assert.That(ir.ToInterval, Is.EqualTo(new TimeSpan(0, 0, 18, 0)));
                Assert.That(ir.CompositeNotification.GetNotification("IconNotification").Enabled);
                Assert.That(
                    ((IconNotification)ir.CompositeNotification.GetNotification("IconNotification"))
                        .FlashCount, Is.EqualTo(5));
                Assert.That(
                    ((IconNotification)ir.CompositeNotification.GetNotification("IconNotification"))
                        .FlashIconPath, Is.EqualTo("res://pomodoro.ico"));
                Assert.That(ir.CompositeNotification.GetNotification("SoundNotification").Enabled);
                Assert.That(
                    ((SoundNotification)
                     ir.CompositeNotification.GetNotification("SoundNotification")).SoundPath,
                    Is.EqualTo("spacey.wav"));
                Assert.That(ir.Description, Is.EqualTo("description"));
            }
        }
        public void HasRunTest()
        {
            using (var cs = new CherryService())
            {
                cs.PluginRepository.RegisterPlugin(new PomodoroSensor());
                var fr = new FirstRunSensor();
                cs.PluginRepository.RegisterPlugin(fr);
                cs.PluginRepository.RegisterPlugin(new FakeTimeProvider());
                cs.PluginRepository.RegisterPlugin(new DatabaseController());
                cs.InitializeCherryServiceEventsAndCommands();
                cs.PluginRepository.TieEvents();
                var csr = new StringReader("<cherryTomato><hasRun /></cherryTomato>");
                cs.LoadConfiguration(csr);

                Assert.That(fr.HasRun, Is.True);
            }
        }
        public void SimpleTest()
        {
            var cs = new CherryService();
            var ftp = new FakeTimeProvider { Now = new DateTime(2009, 05, 13) };
            var ps = new PomodoroSensor();
            cs.PluginRepository.RegisterPlugin(ftp);
            cs.PluginRepository.RegisterPlugin(ps);
            cs.PluginRepository.RegisterPlugin(new DatabaseController());
            cs.InitializeCherryServiceEventsAndCommands();
            cs.PluginRepository.TieEvents();
            ps.ConnectToDatabase(dbCon);

            // Create a couple of fake pomodoros.. One for yesterday and two for today.

            dbCon.ExecuteNonQuery(
                "insert into PomodoroRegistrations (TimeStamp, Duration, Evaluation) values (@p1, @p2, @p3);",
                new DateTime(2009, 05, 12),
                new TimeSpan(0, 0, 25, 0).Ticks,
                5);

            dbCon.ExecuteNonQuery(
                "insert into PomodoroRegistrations (TimeStamp, Duration, Evaluation) values (@p1, @p2, @p3);",
                new DateTime(2009, 05, 13, 12, 30, 0),
                new TimeSpan(0, 0, 25, 0).Ticks,
                5);

            dbCon.ExecuteNonQuery(
                "insert into PomodoroRegistrations (TimeStamp, Duration, Evaluation) values (@p1, @p2, @p3);",
                new DateTime(2009, 05, 13, 13, 30, 0),
                new TimeSpan(0, 0, 25, 0).Ticks,
                5);

            // And connect again to load those into memory
            ps.ConnectToDatabase(dbCon);

            // There are two pomodoros for today. 5 points each.
            Assert.That(ps.TodayProductivity.Pomodoros, Is.EqualTo(2));
            Assert.That(ps.TodayProductivity.Rating, Is.EqualTo(10));

            ps.StartPomodoroInternal();
            ftp.AdvanceMinutes(10);
            ps.StopPomodoroInternal(false);
        }
        public void ManualFlashTest()
        {
            var cs = new CherryService();
            var tp = new TimeProvider();
            var ps = new PomodoroSensor();
            var ic = new IconController();
            var icn = new CherryTomato.Reminders.SystrayIconNotifier.IconNotifier();

            cs.PluginRepository.RegisterPlugin(tp);
            cs.PluginRepository.RegisterPlugin(ps);
            cs.PluginRepository.RegisterPlugin(ic);
            cs.PluginRepository.RegisterPlugin(icn);
            cs.InitializeCherryServiceEventsAndCommands();
            cs.PluginRepository.TieEvents();

            icn.Notify(new IconNotification { FlashCount = 10, FlashIconPath = "res://pomodoro.ico", NotificationText = "Flash test" });

            Assert.That(MessageBox.Show("Did the icon flash?", "Manual assert", MessageBoxButtons.YesNo),
                        Is.EqualTo(DialogResult.Yes));

            cs.Dispose();
        }
        public void SimpleTest()
        {
            var fpaws = new FakeProcessAndWindowSpy();
            var ftp = new FakeTimeProvider {Now = new DateTime(2009, 05, 13)};

            var ats = new CherryTomato.ActiveTaskSensor.ActiveTaskSensor(fpaws);
            var cs = new CherryService();
            var ps = new PomodoroSensor();
            cs.PluginRepository.RegisterPlugin(ftp);
            cs.PluginRepository.RegisterPlugin(ats);
            cs.PluginRepository.RegisterPlugin(ps);
            cs.PluginRepository.RegisterPlugin(new DatabaseController());
            cs.InitializeCherryServiceEventsAndCommands();
            cs.PluginRepository.TieEvents();

            fpaws.ActiveTask = new TaskRegistration { TaskName = "Task1", ProcessName = "Task1" };
            ps.StartPomodoroInternal();
            fpaws.ActiveTask = new TaskRegistration { TaskName = "Task1", ProcessName = "Task1" };
            ats.CountActiveTask();
            ftp.AdvanceMinutes(10);
            ats.CountActiveTask();
            fpaws.ActiveTask = new TaskRegistration { TaskName = "Task2", ProcessName = "Task2" };
            ats.CountActiveTask();
        }
        public void SaveConfigTest()
        {
            using (var cs = new CherryService())
            {
                var irp = new IntervalReminderPlugin();
                cs.PluginRepository.RegisterPlugin(new FakeIconController());
                cs.PluginRepository.RegisterPlugin(irp);
                cs.PluginRepository.RegisterPlugin(new CherryTomato.Core.SoundController.SoundController());
                cs.PluginRepository.RegisterPlugin(new CherryTomato.Reminders.SystrayIconNotifier.IconNotifier());
                cs.PluginRepository.RegisterPlugin(new CherryTomato.Reminders.SoundNotifier.SoundNotifier());
                cs.PluginRepository.RegisterPlugin(new NotifyPluginsRepository());
                cs.PluginRepository.RegisterPlugin(new ConditionCheckerPluginsRepository());
                cs.PluginRepository.RegisterPlugin(new FakeTimeProvider());
                cs.PluginRepository.RegisterPlugin(new FakeWindowsController());
                cs.PluginRepository.RegisterPlugin(new DatabaseController());
                cs.PluginRepository.RegisterPlugin(new PomodoroSensor());
                cs.InitializeCherryServiceEventsAndCommands();
                cs.PluginRepository.TieEvents();

                var ir = new CherryTomato.Reminders.IntervalReminder.IntervalReminder(cs.PluginRepository)
                {
                    FromInterval = new TimeSpan(0, 0, 17, 0),
                    ToInterval = new TimeSpan(0, 0, 18, 0),
                    Enabled = false,
                    Name = "name",
                    Description = "description",
                    CompositeNotification = new CompositeNotification(cs.PluginRepository,
                        new IconNotification { Enabled = true, NotificationText = "ToolTipText", FlashCount = 5, FlashIconPath = "res://pomodoro.ico" },
                        new SoundNotification { SoundPath = "spacey.wav" }),
                };

                var xd = new XmlDocument();
                var remindersElement = xd.CreateElement("reminders");

                irp.SaveReminder(ir, remindersElement);

                var expectedConfig = "<reminders>" +
                   "<reminder enabled=\"False\" typeName=\"Interval Reminder\" name=\"name\" fromInterval=\"00:17:00\" toInterval=\"00:18:00\">" +
                   "<description>description</description>" +
                   "<compositeNotification>" +
                   "<notification typeName=\"IconNotification\" enabled=\"True\" notificationText=\"ToolTipText\" flashIconPath=\"res://pomodoro.ico\" flashCount=\"5\" />" +
                    "<notification typeName=\"SoundNotification\" enabled=\"False\" soundPath=\"spacey.wav\" />" +
                   "</compositeNotification>" +
                   "<compositeCondition />" +
                   "</reminder>" +
                   "</reminders>";
                Assert.That(remindersElement.OuterXml, Is.EqualTo(expectedConfig));
            };
        }
        public void SaveConfigTest()
        {
            var ver = new Version(Application.ProductVersion);
            var dbFile = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\cherrytomato\\database.sqlite";

            using (var cs = new CherryService())
            {
                var csw = new StringWriter();
                cs.PluginRepository.RegisterPlugin(new VersionChecker());
                cs.PluginRepository.RegisterPlugin(new FakeTimeProvider());
                cs.PluginRepository.RegisterPlugin(new PomodoroSensor());
                cs.PluginRepository.RegisterPlugin(new DatabaseController());
                cs.PluginRepository.RegisterPlugin(new FirstRunSensor());
                cs.InitializeCherryServiceEventsAndCommands();
                cs.PluginRepository.TieEvents();

                cs.SaveConfiguration(csw);

                var expected = "<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n" +
                    "<cherryTomato>\r\n" +
                    "  <config>\r\n" +
                    "    <plugins />\r\n" +
                    "  </config>\r\n" +
                    "  <newestKnownVersion major=\"" + ver.Major + "\" minor=\"" + ver.Minor + "\" />\r\n" +
                    "  <databaseFile path=\"" + dbFile + "\" />\r\n" +
                    "  <hasRun />\r\n" +
                    "</cherryTomato>";

                var actual = csw.GetStringBuilder().ToString();

                Assert.That(actual, Is.EqualTo(expected));
            }
        }