Click here to Skip to main content
15,891,136 members
Articles / Desktop Programming / WPF

Model-View-ViewModel in WPF

Rate me:
Please Sign up or sign in to vote.
3.74/5 (15 votes)
21 Dec 2007CPOL5 min read 106.4K   1.8K   42  
An article on creating WPF applications, following the Model-View-ViewModel pattern
  • codeproject.zip
    • CodeProject
      • .bzr
        • branch
          • branch-name
          • format
          • lock
          • revision-history
        • branch-format
        • branch-lock
        • checkout
          • conflicts
          • dirstate
          • format
          • lock
        • README
        • repository
          • format
          • inventory.kndx
          • inventory.knit
          • knits
            • 01
              • assemblyinfo.cs-20071213013430-sngkh9ui5e83ud60-8.kndx
              • assemblyinfo.cs-20071213013430-sngkh9ui5e83ud60-8.knit
              • tasklist.datamodel-20071213014434-wjgek8uvcjo8yp5s-1.kndx
              • tasklist.datamodel-20071213014434-wjgek8uvcjo8yp5s-1.knit
            • 08
              • properties-20071213014434-wjgek8uvcjo8yp5s-3.kndx
              • properties-20071213014434-wjgek8uvcjo8yp5s-3.knit
            • 0a
              • taskcollectiontest.c-20071213180529-6351e013ut030x8d-1.kndx
              • taskcollectiontest.c-20071213180529-6351e013ut030x8d-1.knit
            • 10
              • tasklist.viewmodel-20071213212525-zmxqp3frjbsg0b0z-1.kndx
              • tasklist.viewmodel-20071213212525-zmxqp3frjbsg0b0z-1.knit
            • 15
              • itasklistapplication-20071213212525-zmxqp3frjbsg0b0z-3.kndx
              • itasklistapplication-20071213212525-zmxqp3frjbsg0b0z-3.knit
            • 16
              • resources.designer.c-20071213035543-53ny0xm8ahdeup8a-3.kndx
              • resources.designer.c-20071213035543-53ny0xm8ahdeup8a-3.knit
            • 19
              • assemblyinfo.cs-20071213213342-s7iwkoswpulzwbg4-5.kndx
              • assemblyinfo.cs-20071213213342-s7iwkoswpulzwbg4-5.knit
            • 1b
              • propertychangedwatch-20071213013237-ucb9omrtgj50gglg-10.kndx
              • propertychangedwatch-20071213013237-ucb9omrtgj50gglg-10.knit
            • 27
              • commandsinkattribute-20071214020122-tzvrpu3a2hvv9ioh-1.kndx
              • commandsinkattribute-20071214020122-tzvrpu3a2hvv9ioh-1.knit
              • test.tasklist.viewmo-20071213213342-s7iwkoswpulzwbg4-1.kndx
              • test.tasklist.viewmo-20071213213342-s7iwkoswpulzwbg4-1.knit
            • 2a
              • test.tasklist.viewmo-20071213213342-s7iwkoswpulzwbg4-4.kndx
              • test.tasklist.viewmo-20071213213342-s7iwkoswpulzwbg4-4.knit
            • 2c
              • tasklistviewmodel.cs-20071213213222-558xu0jc4awt8fgg-1.kndx
              • tasklistviewmodel.cs-20071213213222-558xu0jc4awt8fgg-1.knit
            • 32
              • selection.cs-20071215202735-qp5k90odcm8iomjv-1.kndx
              • selection.cs-20071215202735-qp5k90odcm8iomjv-1.knit
            • 38
              • testdataerrorinfo.cs-20071213023410-3b817j85lvxslkns-1.kndx
              • testdataerrorinfo.cs-20071213023410-3b817j85lvxslkns-1.knit
            • 3a
              • tasklistcommands.cs-20071215160037-lz7a3je7txcjyri5-1.kndx
              • tasklistcommands.cs-20071215160037-lz7a3je7txcjyri5-1.knit
            • 3c
              • edittaskpage.xaml-20071215212433-9gnk5rr3mjw0gjrf-1.kndx
              • edittaskpage.xaml-20071215212433-9gnk5rr3mjw0gjrf-1.knit
              • properties-20071213013430-sngkh9ui5e83ud60-6.kndx
              • properties-20071213013430-sngkh9ui5e83ud60-6.knit
            • 3f
              • taskcollection.cs-20071213181230-6z9ws0p8k1vkjzuc-1.kndx
              • taskcollection.cs-20071213181230-6z9ws0p8k1vkjzuc-1.knit
            • 40
              • mainwindowviewmodelt-20071213213449-ns60l2kj4h237pzg-1.kndx
              • mainwindowviewmodelt-20071213213449-ns60l2kj4h237pzg-1.knit
            • 41
              • edittaskpage.xaml.cs-20071215212433-9gnk5rr3mjw0gjrf-2.kndx
              • edittaskpage.xaml.cs-20071215212433-9gnk5rr3mjw0gjrf-2.knit
            • 45
              • globalsuppressions.c-20071217043309-o86x25nntk0bk6lo-1.kndx
              • globalsuppressions.c-20071217043309-o86x25nntk0bk6lo-1.knit
            • 4c
              • globalsuppressions.c-20071213211235-souqg3uilzehioee-1.kndx
              • globalsuppressions.c-20071213211235-souqg3uilzehioee-1.knit
            • 4e
              • localtestrun.testrun-20071213013430-sngkh9ui5e83ud60-2.kndx
              • localtestrun.testrun-20071213013430-sngkh9ui5e83ud60-2.knit
            • 4f
              • precondition.cs-20071213022255-ecv7q7up7nar12vq-1.kndx
              • precondition.cs-20071213022255-ecv7q7up7nar12vq-1.knit
            • 51
              • codeproject.snk-20071213021143-3x1ioaofarxdc7k2-2.kndx
              • codeproject.snk-20071213021143-3x1ioaofarxdc7k2-2.knit
            • 54
              • properties-20071213213342-s7iwkoswpulzwbg4-3.kndx
              • properties-20071213213342-s7iwkoswpulzwbg4-3.knit
            • 57
              • tasktest.cs-20071213013555-48d7c3agymuoj2i0-1.kndx
              • tasktest.cs-20071213013555-48d7c3agymuoj2i0-1.knit
            • 58
              • assemblyinfo.cs-20071213021143-3x1ioaofarxdc7k2-5.kndx
              • assemblyinfo.cs-20071213021143-3x1ioaofarxdc7k2-5.knit
            • 5e
              • iedittaskpageview.cs-20071217021058-4xiyah3s4mh60qow-1.kndx
              • iedittaskpageview.cs-20071217021058-4xiyah3s4mh60qow-1.knit
            • 61
              • assemblyinfo.cs-20071213022943-ws0x3cedbvac5k3p-5.kndx
              • assemblyinfo.cs-20071213022943-ws0x3cedbvac5k3p-5.knit
            • 67
              • codeprojectcore.cspr-20071213021143-3x1ioaofarxdc7k2-3.kndx
              • codeprojectcore.cspr-20071213021143-3x1ioaofarxdc7k2-3.knit
            • 6d
              • tasklistpageviewmode-20071215194732-4g7n1tutd5u4iig0-4.kndx
              • tasklistpageviewmode-20071215194732-4g7n1tutd5u4iig0-4.knit
            • 71
              • codeproject.sln-20071213013011-q70xfq7n7ogllazi-1.kndx
              • codeproject.sln-20071213013011-q70xfq7n7ogllazi-1.knit
            • 76
              • test.codeprojectcore-20071213022943-ws0x3cedbvac5k3p-1.kndx
              • test.codeprojectcore-20071213022943-ws0x3cedbvac5k3p-1.knit
            • 79
              • test.codeprojectcore-20071213022943-ws0x3cedbvac5k3p-4.kndx
              • test.codeprojectcore-20071213022943-ws0x3cedbvac5k3p-4.knit
            • 7f
              • authoringtests.txt-20071213013430-sngkh9ui5e83ud60-4.kndx
              • authoringtests.txt-20071213013430-sngkh9ui5e83ud60-4.knit
              • codeprojectcore-20071213021143-3x1ioaofarxdc7k2-1.kndx
              • codeprojectcore-20071213021143-3x1ioaofarxdc7k2-1.knit
            • 86
              • resources.resx-20071213013237-ucb9omrtgj50gglg-16.kndx
              • resources.resx-20071213013237-ucb9omrtgj50gglg-16.knit
            • 8a
              • bzrignore-20071213012954-kvrppfyxdd192lwi-1.kndx
              • bzrignore-20071213012954-kvrppfyxdd192lwi-1.knit
            • 8d
              • resources.resx-20071213211717-wf3kh2bgsnduzgg4-12.kndx
              • resources.resx-20071213211717-wf3kh2bgsnduzgg4-12.knit
            • 90
              • viewmodel.cs-20071214020122-tzvrpu3a2hvv9ioh-2.kndx
              • viewmodel.cs-20071214020122-tzvrpu3a2hvv9ioh-2.knit
            • 93
              • codeproject.snk-20071213013237-ucb9omrtgj50gglg-3.kndx
              • codeproject.snk-20071213013237-ucb9omrtgj50gglg-3.knit
            • 94
              • properties-20071213021143-3x1ioaofarxdc7k2-4.kndx
              • properties-20071213021143-3x1ioaofarxdc7k2-4.knit
            • 95
              • tasklist.datamodel.c-20071213014434-wjgek8uvcjo8yp5s-4.kndx
              • tasklist.datamodel.c-20071213014434-wjgek8uvcjo8yp5s-4.knit
            • 97
              • stringlengthvalidato-20071213035543-53ny0xm8ahdeup8a-2.kndx
              • stringlengthvalidato-20071213035543-53ny0xm8ahdeup8a-2.knit
            • 98
              • authoringtests.txt-20071213213342-s7iwkoswpulzwbg4-2.kndx
              • authoringtests.txt-20071213213342-s7iwkoswpulzwbg4-2.knit
            • 9c
              • properties-20071213022943-ws0x3cedbvac5k3p-3.kndx
              • properties-20071213022943-ws0x3cedbvac5k3p-3.knit
            • 9f
              • codeproject.snk-20071213211717-wf3kh2bgsnduzgg4-4.kndx
              • codeproject.snk-20071213211717-wf3kh2bgsnduzgg4-4.knit
            • a5
              • resources.designer.c-20071213013237-ucb9omrtgj50gglg-15.kndx
              • resources.designer.c-20071213013237-ucb9omrtgj50gglg-15.knit
              • tasklist.viewmodel.c-20071213212525-zmxqp3frjbsg0b0z-5.kndx
              • tasklist.viewmodel.c-20071213212525-zmxqp3frjbsg0b0z-5.knit
            • a6
              • tasklisttestapplicat-20071213214943-dyyzzbvhjnv2ggob-1.kndx
              • tasklisttestapplicat-20071213214943-dyyzzbvhjnv2ggob-1.knit
            • ac
              • resources.designer.c-20071213211717-wf3kh2bgsnduzgg4-11.kndx
              • resources.designer.c-20071213211717-wf3kh2bgsnduzgg4-11.knit
            • ae
              • specify.cs-20071213013237-ucb9omrtgj50gglg-12.kndx
              • specify.cs-20071213013237-ucb9omrtgj50gglg-12.knit
            • af
              • imainwindowview.cs-20071214025649-nyfq33grd351tyuj-1.kndx
              • imainwindowview.cs-20071214025649-nyfq33grd351tyuj-1.knit
            • b1
              • mainwindow.xaml-20071213211717-wf3kh2bgsnduzgg4-5.kndx
              • mainwindow.xaml-20071213211717-wf3kh2bgsnduzgg4-5.knit
            • b2
              • app.xaml-20071213211717-wf3kh2bgsnduzgg4-2.kndx
              • app.xaml-20071213211717-wf3kh2bgsnduzgg4-2.knit
            • b3
              • tasklist.csproj.user-20071213211717-wf3kh2bgsnduzgg4-9.kndx
              • tasklist.csproj.user-20071213211717-wf3kh2bgsnduzgg4-9.knit
            • b4
              • codeproject.snk-20071213212525-zmxqp3frjbsg0b0z-2.kndx
              • codeproject.snk-20071213212525-zmxqp3frjbsg0b0z-2.knit
              • frameworkmessages.cs-20071213013237-ucb9omrtgj50gglg-6.kndx
              • frameworkmessages.cs-20071213013237-ucb9omrtgj50gglg-6.knit
            • b6
              • mainwindow.xaml.cs-20071213211717-wf3kh2bgsnduzgg4-6.kndx
              • mainwindow.xaml.cs-20071213211717-wf3kh2bgsnduzgg4-6.knit
            • b7
              • app.xaml.cs-20071213211717-wf3kh2bgsnduzgg4-3.kndx
              • app.xaml.cs-20071213211717-wf3kh2bgsnduzgg4-3.knit
              • settings.designer.cs-20071213211717-wf3kh2bgsnduzgg4-13.kndx
              • settings.designer.cs-20071213211717-wf3kh2bgsnduzgg4-13.knit
            • bc
              • assemblyinfo.cs-20071213212525-zmxqp3frjbsg0b0z-6.kndx
              • assemblyinfo.cs-20071213212525-zmxqp3frjbsg0b0z-6.knit
            • bd
              • app.config-20071215154029-mlxydmaa3bclnaag-1.kndx
              • app.config-20071215154029-mlxydmaa3bclnaag-1.knit
            • be
              • edittaskpageviewmode-20071215212433-9gnk5rr3mjw0gjrf-3.kndx
              • edittaskpageviewmode-20071215212433-9gnk5rr3mjw0gjrf-3.knit
            • c0
              • codeproject.visualst-20071213013237-ucb9omrtgj50gglg-1.kndx
              • codeproject.visualst-20071213013237-ucb9omrtgj50gglg-1.knit
            • c1
              • codeproject.visualst-20071213013237-ucb9omrtgj50gglg-2.kndx
              • codeproject.visualst-20071213013237-ucb9omrtgj50gglg-2.knit
            • c2
              • tasklistpageviewmode-20071215200239-p788d71fwwxauwrm-1.kndx
              • tasklistpageviewmode-20071215200239-p788d71fwwxauwrm-1.knit
            • c5
              • commandtester.cs-20071214020412-lzl7v3k2q5et9xoj-1.kndx
              • commandtester.cs-20071214020412-lzl7v3k2q5et9xoj-1.knit
              • specificationvalue.c-20071213013237-ucb9omrtgj50gglg-11.kndx
              • specificationvalue.c-20071213013237-ucb9omrtgj50gglg-11.knit
              • tasklist.csproj-20071213211717-wf3kh2bgsnduzgg4-8.kndx
              • tasklist.csproj-20071213211717-wf3kh2bgsnduzgg4-8.knit
            • c6
              • codeproject.snk-20071213014434-wjgek8uvcjo8yp5s-2.kndx
              • codeproject.snk-20071213014434-wjgek8uvcjo8yp5s-2.knit
            • c9
              • assemblyinfo.cs-20071213013237-ucb9omrtgj50gglg-14.kndx
              • assemblyinfo.cs-20071213013237-ucb9omrtgj50gglg-14.knit
            • ca
              • collectionchangedwat-20071213013237-ucb9omrtgj50gglg-4.kndx
              • collectionchangedwat-20071213013237-ucb9omrtgj50gglg-4.knit
            • cb
              • collectionchangedwat-20071213013237-ucb9omrtgj50gglg-5.kndx
              • collectionchangedwat-20071213013237-ucb9omrtgj50gglg-5.knit
            • cc
              • testextensions.cs-20071213013237-ucb9omrtgj50gglg-13.kndx
              • testextensions.cs-20071213013237-ucb9omrtgj50gglg-13.knit
            • cd
              • assemblyinfo.cs-20071213014434-wjgek8uvcjo8yp5s-5.kndx
              • assemblyinfo.cs-20071213014434-wjgek8uvcjo8yp5s-5.knit
              • codeproject.vsmdi-20071213013430-sngkh9ui5e83ud60-1.kndx
              • codeproject.vsmdi-20071213013430-sngkh9ui5e83ud60-1.knit
            • d0
              • assemblyinfo.cs-20071213211717-wf3kh2bgsnduzgg4-10.kndx
              • assemblyinfo.cs-20071213211717-wf3kh2bgsnduzgg4-10.knit
            • d2
              • mainwindowviewmodel.-20071214021535-pfu4qerfstp78gcd-1.kndx
              • mainwindowviewmodel.-20071214021535-pfu4qerfstp78gcd-1.knit
            • d4
              • manualtest1.mht-20071213013430-sngkh9ui5e83ud60-5.kndx
              • manualtest1.mht-20071213013430-sngkh9ui5e83ud60-5.knit
              • settings.settings-20071213211717-wf3kh2bgsnduzgg4-14.kndx
              • settings.settings-20071213211717-wf3kh2bgsnduzgg4-14.knit
            • d6
              • task.cs-20071213014820-kfzciheohayefljq-1.kndx
              • task.cs-20071213014820-kfzciheohayefljq-1.knit
            • d9
              • properties-20071213013237-ucb9omrtgj50gglg-8.kndx
              • properties-20071213013237-ucb9omrtgj50gglg-8.knit
            • de
              • itasklistpageview.cs-20071215201802-5gm7npkr8rynfbpn-1.kndx
              • itasklistpageview.cs-20071215201802-5gm7npkr8rynfbpn-1.knit
            • e0
              • authoringtests.txt-20071213022943-ws0x3cedbvac5k3p-2.kndx
              • authoringtests.txt-20071213022943-ws0x3cedbvac5k3p-2.knit
            • e3
              • dataerrorinfo.cs-20071213023841-9p8uxe73oezcfbdz-1.kndx
              • dataerrorinfo.cs-20071213023841-9p8uxe73oezcfbdz-1.knit
              • properties-20071213211717-wf3kh2bgsnduzgg4-7.kndx
              • properties-20071213211717-wf3kh2bgsnduzgg4-7.knit
            • ea
              • tasklistpage.xaml-20071215194732-4g7n1tutd5u4iig0-1.kndx
              • tasklistpage.xaml-20071215194732-4g7n1tutd5u4iig0-1.knit
            • ed
              • test.tasklist.datamo-20071213013430-sngkh9ui5e83ud60-3.kndx
              • test.tasklist.datamo-20071213013430-sngkh9ui5e83ud60-3.knit
            • ef
              • tasklistpage.xaml.cs-20071215194732-4g7n1tutd5u4iig0-2.kndx
              • tasklistpage.xaml.cs-20071215194732-4g7n1tutd5u4iig0-2.knit
            • f1
              • test.tasklist.datamo-20071213013430-sngkh9ui5e83ud60-7.kndx
              • test.tasklist.datamo-20071213013430-sngkh9ui5e83ud60-7.knit
            • f3
              • propertychangedwatch-20071213013237-ucb9omrtgj50gglg-9.kndx
              • propertychangedwatch-20071213013237-ucb9omrtgj50gglg-9.knit
            • f4
              • objectextensions.cs-20071213035543-53ny0xm8ahdeup8a-1.kndx
              • objectextensions.cs-20071213035543-53ny0xm8ahdeup8a-1.knit
            • f5
              • numerics.cs-20071213013237-ucb9omrtgj50gglg-7.kndx
              • numerics.cs-20071213013237-ucb9omrtgj50gglg-7.knit
            • f7
              • properties-20071213212525-zmxqp3frjbsg0b0z-4.kndx
              • properties-20071213212525-zmxqp3frjbsg0b0z-4.knit
              • resources.resx-20071213035543-53ny0xm8ahdeup8a-4.kndx
              • resources.resx-20071213035543-53ny0xm8ahdeup8a-4.knit
            • f9
              • validatorattribute.c-20071213025856-7hxu8ce3k2040pyr-1.kndx
              • validatorattribute.c-20071213025856-7hxu8ce3k2040pyr-1.knit
            • fe
              • titleconverter.cs-20071215194732-4g7n1tutd5u4iig0-3.kndx
              • titleconverter.cs-20071215194732-4g7n1tutd5u4iig0-3.knit
            • ff
              • tasklist-20071213211717-wf3kh2bgsnduzgg4-1.kndx
              • tasklist-20071213211717-wf3kh2bgsnduzgg4-1.knit
          • lock
          • revisions.kndx
          • revisions.knit
          • revision-store
          • signatures.kndx
          • signatures.knit
      • .bzrignore
      • CodeProject.sln
      • CodeProject.VisualStudio.QualityTools.UnitTestFramework
      • CodeProject.vsmdi
      • CodeProjectCore
      • LocalTestRun.testrunconfig
      • TaskList.DataModel
      • TaskList.ViewModel
      • TaskList
      • Test.CodeProjectCore
      • Test.TaskList.DataModel
      • Test.TaskList.ViewModel
using System.IO;
using CodeProject.VisualStudio.QualityTools.UnitTestFramework;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using TaskList.DataModel;

namespace Test.TaskList.DataModel
{
    [TestClass]
    public class TaskCollectionTest
    {
        public TaskCollectionTest()
        {
        }

        private TestContext testContextInstance;

        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region Additional test attributes
        //
        // You can use the following additional attributes as you write your tests:
        //
        // Use ClassInitialize to run code before running the first test in the class
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // Use ClassCleanup to run code after all tests in a class have run
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // Use TestInitialize to run code before running each test 
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // Use TestCleanup to run code after each test has run
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion

        [TestMethod]
        public void TaskCollection_should_construct_empty()
        {
            TaskCollection target = new TaskCollection();
            Specify.That(target).ShouldBeEmpty();
        }

        [TestMethod]
        public void TaskCollection_should_construct_with_IsDirty_false()
        {
            TaskCollection target = new TaskCollection();
            Specify.That(target.IsDirty).ShouldBeFalse();
        }

        [TestMethod]
        public void IsDirty_assignment_should_notify_property_changed()
        {
            TaskCollection target = new TaskCollection();
            PropertyChangedWatcher watcher = new PropertyChangedWatcher(target);
            target.IsDirty = true;
            Specify.That(watcher).ShouldHaveSeen("IsDirty");
        }

        [TestMethod]
        public void Add_should_set_IsDirty_true()
        {
            TaskCollection target = new TaskCollection();
            Task item = new Task();
            target.Add(item);
            Specify.That(target.IsDirty).ShouldBeTrue();
        }

        [TestMethod]
        public void Add_should_notify_IsDirty_changed()
        {
            TaskCollection target = new TaskCollection();
            Task item = new Task();
            PropertyChangedWatcher watcher = new PropertyChangedWatcher(target);
            target.Add(item);
            Specify.That(watcher).ShouldHaveSeen("IsDirty");
        }

        [TestMethod]
        public void Remove_should_set_IsDirty_true()
        {
            TaskCollection target = new TaskCollection();
            Task item = new Task();
            target.Add(item);
            target.IsDirty = false;
            target.Remove(item);
            Specify.That(target.IsDirty).ShouldBeTrue();
        }

        [TestMethod]
        public void Remove_should_notify_IsDirty_changed()
        {
            TaskCollection target = new TaskCollection();
            Task item = new Task();
            target.Add(item);
            target.IsDirty = false;
            PropertyChangedWatcher watcher = new PropertyChangedWatcher(target);
            target.Remove(item);
            Specify.That(watcher).ShouldHaveSeen("IsDirty");
        }

        [TestMethod]
        public void Clear_should_set_IsDirty_true()
        {
            TaskCollection target = new TaskCollection();
            Task item = new Task();
            target.Add(item);
            target.IsDirty = false;
            target.Clear();
            Specify.That(target.IsDirty).ShouldBeTrue();
        }

        [TestMethod]
        public void Clear_should_not_set_IsDirty_true_when_already_empty()
        {
            TaskCollection target = new TaskCollection();
            target.Clear();
            Specify.That(target.IsDirty).ShouldBeFalse();
        }

        [TestMethod]
        public void Clear_should_notify_IsDirty_changed()
        {
            TaskCollection target = new TaskCollection();
            Task item = new Task();
            target.Add(item);
            target.IsDirty = false;
            PropertyChangedWatcher watcher = new PropertyChangedWatcher(target);
            target.Clear();
            Specify.That(watcher).ShouldHaveSeen("IsDirty");
        }

        [TestMethod]
        public void Item_assignment_should_set_IsDirty_true()
        {
            TaskCollection target = new TaskCollection();
            Task item = new Task();
            target.Add(item);
            target.IsDirty = false;
            target[0] = null;
            Specify.That(target.IsDirty).ShouldBeTrue();
        }

        [TestMethod]
        public void Item_assignment_to_same_item_should_not_set_IsDirty_true()
        {
            TaskCollection target = new TaskCollection();
            Task item = new Task();
            target.Add(item);
            target.IsDirty = false;
            target[0] = item;
            Specify.That(target.IsDirty).ShouldBeFalse();
        }

        [TestMethod]
        public void Item_assignment_should_notify_IsDirty_changed()
        {
            TaskCollection target = new TaskCollection();
            Task item = new Task();
            target.Add(item);
            target.IsDirty = false;
            PropertyChangedWatcher watcher = new PropertyChangedWatcher(target);
            target[0] = null;
            Specify.That(watcher).ShouldHaveSeen("IsDirty");
        }

        [TestMethod]
        public void Move_should_set_IsDirty_true()
        {
            TaskCollection target = new TaskCollection();
            Task first = new Task();
            Task second = new Task();
            target.Add(first);
            target.Add(second);
            target.IsDirty = false;
            target.Move(0, 1);
            Specify.That(target.IsDirty).ShouldBeTrue();
        }

        [TestMethod]
        public void Move_should_notify_IsDirty_changed()
        {
            TaskCollection target = new TaskCollection();
            Task first = new Task();
            Task second = new Task();
            target.Add(first);
            target.Add(second);
            target.IsDirty = false;
            PropertyChangedWatcher watcher = new PropertyChangedWatcher(target);
            target.Move(0, 1);
            Specify.That(watcher).ShouldHaveSeen("IsDirty");
        }

        [TestMethod]
        public void TaskCollection_should_be_serializable()
        {
            TaskCollection target = new TaskCollection();
            string expectedTitle = "xyzzy";
            Task item = new Task();
            item.Title = expectedTitle;
            target.Add(item);
            TaskCollection clone = target.SerializeClone();
            Specify.That(clone[0].Title).ShouldEqual(expectedTitle);
        }

        [TestMethod]
        public void Modifying_item_should_set_IsDirty_true()
        {
            TaskCollection target = new TaskCollection();
            Task item = new Task();
            target.Add(item);
            target.IsDirty = false;
            item.Title = "xyzzy";
            Specify.That(target.IsDirty).ShouldBeTrue();
        }

        [TestMethod]
        public void Modifying_item_should_notify_IsDirty_changed()
        {
            TaskCollection target = new TaskCollection();
            Task item = new Task();
            target.Add(item);
            target.IsDirty = false;
            PropertyChangedWatcher watcher = new PropertyChangedWatcher(target);
            item.Title = "xyzzy";
            Specify.That(watcher).ShouldHaveSeen("IsDirty");
        }

        [TestMethod]
        public void Save_should_create_file()
        {
            string fileName = Path.GetTempFileName();
            try
            {
                File.Delete(fileName);
                TaskCollection target = new TaskCollection();
                Task item = new Task();
                item.Title = "xyzzy";
                target.Add(item);
                target.Save(fileName);
                Specify.That(File.Exists(fileName));
            }
            finally
            {
                File.Delete(fileName);
            }
        }

        [TestMethod]
        public void Load_should_load_new_TaskCollection()
        {
            string fileName = Path.GetTempFileName();
            try
            {
                File.Delete(fileName);
                TaskCollection target = new TaskCollection();
                string expectedTitle = "xyzzy";
                Task item = new Task();
                item.Title = expectedTitle;
                target.Add(item);
                target.Save(fileName);
                TaskCollection loaded = TaskCollection.Load(fileName);
                Specify.That(loaded[0].Title).ShouldEqual(expectedTitle);
            }
            finally
            {
                File.Delete(fileName);
            }
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
United States United States
Windows developer with 10+ years experience working in the banking industry.

Comments and Discussions