Click here to Skip to main content
15,895,746 members
Articles / Programming Languages / Visual Basic

Using the Specification Design Pattern

Rate me:
Please Sign up or sign in to vote.
3.93/5 (4 votes)
5 Apr 2009CPOL3 min read 25.9K   179   12  
The final part of a four part series of articles on the Specification Design Pattern.
Imports NUnit.Framework

<TestFixture()> _
Public Class GenericTests
    <Test()> _
    Public Sub TestDrum()
        Dim drum As New Drum("Acid", 500, New ContainerSpecification(ContainerFeature.Armored))
        Assert.AreEqual("Acid", drum.Chemical)
        Assert.AreEqual(500, drum.Size)

        Dim container As New Container(10000, ContainerFeature.Armored)
        Assert.IsTrue(drum.RequiredContainer.IsSatisfiedBy(container))
    End Sub

    <Test()> _
    Public Sub TestContainer()
        Dim container As New Container(10000, ContainerFeature.Armored)
        Assert.AreEqual(10000, container.capacity)
        Assert.AreEqual(ContainerFeature.Armored, container.Features)
    End Sub

    <Test()> _
    Public Sub TestAddDrumsToContainer()
        Dim container As New Container(10000, ContainerFeature.Armored)

        Dim acidDrum As New Drum("Acid", 2000, New ContainerSpecification(ContainerFeature.Armored))
        container.AddDrum(acidDrum)

        Dim tntDrum As New Drum("TNT", 3000, New ContainerSpecification(ContainerFeature.Armored))
        container.AddDrum(tntDrum)

        Assert.AreEqual(2, container.Drums.Count)
        Assert.AreEqual(5000, container.RemainingSpace)

    End Sub

    <Test()> _
    Public Sub CanAccommodate()
        Dim container As New Container(10000, ContainerFeature.Armored)

        Dim uraniumDrum As New Drum("Uranium", 11000, New ContainerSpecification(ContainerFeature.Armored))
        Assert.IsFalse(container.canAccommodate(uraniumDrum))

        Dim tntDrum As New Drum("TNT", 9000, New ContainerSpecification(ContainerFeature.Ventilated))
        Assert.IsFalse(container.canAccommodate(tntDrum))

        Dim sulpherDrum As New Drum("Sulpher", 10000, New ContainerSpecification(ContainerFeature.Armored))
        Assert.IsTrue(container.canAccommodate(sulpherDrum))
    End Sub

    <Test()> _
    Public Sub IsSafelyPacked()
        Dim container As New Container(10000, ContainerFeature.Armored)

        Dim uraniumDrum As New Drum("Uranium", 5000, New ContainerSpecification(ContainerFeature.Armored))
        container.AddDrum(uraniumDrum)

        Dim sulpherDrum As New Drum("Sulpher", 2000, New ContainerSpecification(ContainerFeature.Armored))
        container.AddDrum(sulpherDrum)

        Assert.IsTrue(container.isSafelyPacked)

        Dim tntDrum As New Drum("TNT", 3000, New ContainerSpecification(ContainerFeature.Ventilated))
        container.AddDrum(tntDrum)

        Assert.IsFalse(container.isSafelyPacked)
    End Sub

    <Test()> _
    Public Sub CompoundSpecification()
        ' Create Containers
        Dim armoredContainer As New Container(10000, ContainerFeature.Armored)
        Dim ventilatedContainer As New Container(10000, ContainerFeature.Ventilated)
        Dim armoredAndVentilatedContainer As New Container(10000, ContainerFeature.Armored Or ContainerFeature.Ventilated)

        ' Create Specifications
        Dim armoredSpec As New ContainerSpecification(ContainerFeature.Armored)
        Dim ventilatedSpec As New ContainerSpecification(ContainerFeature.Ventilated)
        Dim either As ContainerSpecification = armoredSpec Or ventilatedSpec
        Dim both As ContainerSpecification = armoredSpec And ventilatedSpec

        ' Create Drums, using Specifications to define acceptable containers
        Dim uraniumDrum As New Drum("Uranium", 5000, either)
        Dim tntDrum As New Drum("TNT", 5000, both)

        ' Test Containers against the acceptable definitions for each Drum
        ' uranium requires Either
        Assert.IsTrue(uraniumDrum.RequiredContainer.IsSatisfiedBy(armoredContainer))
        Assert.IsTrue(uraniumDrum.RequiredContainer.IsSatisfiedBy(ventilatedContainer))

        ' Test Containers against the acceptable definitions for each Drum
        ' tnt requires both
        Assert.IsTrue(tntDrum.RequiredContainer.IsSatisfiedBy(armoredAndVentilatedContainer))
        Assert.IsFalse(tntDrum.RequiredContainer.IsSatisfiedBy(armoredContainer))
        Assert.IsFalse(tntDrum.RequiredContainer.IsSatisfiedBy(ventilatedContainer))

    End Sub

End Class

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
Ireland Ireland
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions