Beispiel #1
0
        public void should_not_send_the_rest_to_children_if_no_unit_matched()
        {
            var expected1 = new UnitId("expected", "expected");
            var expected2 = new UnitId("expected1l", "expected");

            // --arrange
            var target = new SkipTillUnit(new UnitPattern("absent"));
            var child1 = A.Fake <IBuildChainPattern>();
            var child2 = A.Fake <IBuildChainPattern>();

            target.AddNode(child1);
            target.AddNode(child2);

            // --act
            var chain = new[] { new UnitId(1, null), new UnitId(2, null), expected1, expected2 }.ToArrayTail();
            WeightedBuildActionBag?actionBag;

            target.GatherBuildActions(chain, out actionBag, 0);

            // --assert
            WeightedBuildActionBag?weightedBuildActionBag;

            A.CallTo(() => child1.GatherBuildActions(An <BuildChain> ._, out weightedBuildActionBag, An <int> ._)).WithAnyArguments().MustNotHaveHappened();
            WeightedBuildActionBag?actionBag1;

            A.CallTo(() => child2.GatherBuildActions(An <BuildChain> ._, out actionBag1, An <int> ._)).WithAnyArguments().MustNotHaveHappened();
        }
Beispiel #2
0
        public void should_add_self_weight_to_input_weight()
        {
            const string kind          = "kind";
            const int    patternWeight = 39;
            const int    inputWeight   = 21;

            // --arrange
            var target = new SkipTillUnit(new UnitPattern(kind), patternWeight);
            var child1 = A.Fake <IBuildChainPattern>();
            var child2 = A.Fake <IBuildChainPattern>();

            target.AddNode(child1);
            target.AddNode(child2);

            // --act
            var chain = new[] { new UnitId(kind, null), new UnitId(kind, null) }.ToArrayTail();
            WeightedBuildActionBag?actionBag;

            target.GatherBuildActions(chain, out actionBag, inputWeight);

            // --assert
            WeightedBuildActionBag?weightedBuildActionBag;

            A.CallTo(() => child1.GatherBuildActions(An <BuildChain> ._, out weightedBuildActionBag, inputWeight + patternWeight)).MustHaveHappenedOnceAndOnly();
            WeightedBuildActionBag?actionBag1;

            A.CallTo(() => child2.GatherBuildActions(An <BuildChain> ._, out actionBag1, inputWeight + patternWeight)).MustHaveHappenedOnceAndOnly();
        }
Beispiel #3
0
        public void should_return_children_merged_actions()
        {
            // --arrange
            var unitIdMatcher = Match.Type <int>(null);
            var buildStep1    = new IfFirstUnit(unitIdMatcher);

            buildStep1.UseBuildAction(Static.Of <CreateByReflection>(), BuildStage.Cache);

            var singletonAction = new Singleton();
            var buildStep2      = new SkipTillUnit(unitIdMatcher);

            buildStep2.UseBuildAction(singletonAction, BuildStage.Cache);

            var target = new SkipTillUnit(Match.Type <string>(null));

            target.GetOrAddNode(buildStep1);
            target.GetOrAddNode(buildStep2);

            // --act
            var actual = target.GatherBuildActions(new[] { Unit.IsType <string>(), Unit.IsType <int>() }.ToBuildChain(), out var actionBag, 0);

            // --assert
            actual.Should().BeTrue();
            actionBag.Should().NotBeNull();

            actionBag ![BuildStage.Cache]
    /// <summary>
    /// Overrides a previously registered <see cref="Treat{T}"/>. Mostly used in test environment to use mocks instead of real subsystems.
    /// </summary>
    public static TreatingTuner <T> TreatOverride <T>(this IBuildChainPattern pattern, object?tag = null)
    {
        if (pattern is null)
        {
            throw new ArgumentNullException(nameof(pattern));
        }

        var newPatternMatcher = new SkipTillUnit(new UnitPattern(typeof(T), tag), WeightOf.BuildChainPattern.TargetUnit + WeightOf.UnitPattern.ExactTypePattern);
        var oldPatternMatcher = pattern.Children.Single(_ => _.Equals(newPatternMatcher));

        pattern.Children.Remove(oldPatternMatcher);
        return(new TreatingTuner <T>(pattern.AddNode(newPatternMatcher)));
    }
Beispiel #5
0
    /// <summary>
    /// Add build actions for units building in the context of unit representing by <paramref name="type"/> and <paramref name="tag"/> in subsequence calls.
    /// </summary>
    public RootTuner Building(Type type, object?tag = null)
    {
        if (type is null)
        {
            throw new ArgumentNullException(nameof(type));
        }

        var patternMatcher = new SkipTillUnit(
            new UnitPattern(type, tag),
            Weight
            + WeightOf.UnitPattern.ExactTypePattern);

        return(new RootTuner(ParentNode.GetOrAddNode(patternMatcher)));
    }
Beispiel #6
0
    /// <summary>
    /// Add build actions to build a unit representing by <paramref name="type"/> and <paramref name="tag"/> in subsequence calls.
    /// </summary>
    public TreatingTuner Treat(Type type, object?tag = null)
    {
        if (type is null)
        {
            throw new ArgumentNullException(nameof(type));
        }
        if (type.IsGenericTypeDefinition)
        {
            throw new ArgumentException($"Use {nameof(TreatOpenGeneric)} to setup open generic types.");
        }

        var patternMatcher = new SkipTillUnit(
            new UnitPattern(type, tag),
            Weight
            + WeightOf.BuildChainPattern.TargetUnit
            + WeightOf.UnitPattern.ExactTypePattern);

        return(new TreatingTuner(ParentNode.GetOrAddNode(patternMatcher)));
    }
        public void should_return_all_merged_actions()
        {
            var singletonAction = new Singleton();

            // --arrange
            var unitIdMatcher = Match.Type <string>(null);
            var matchString   = new IfFirstUnit(unitIdMatcher).UseBuildAction(new CreateByReflection(), BuildStage.Cache);
            var matchAny      = new SkipTillUnit(unitIdMatcher).UseBuildAction(singletonAction, BuildStage.Cache);

            var target = new BuildChainPatternTree();

            target.Children.Add(matchString);
            target.Children.Add(matchAny);

            // --act
            var actual = target.GatherBuildActions(new[] { Unit.IsType <string>() }.ToArrayTail(), out var actionBag);

            // --assert
            actual.Should().BeTrue();
            actionBag ![BuildStage.Cache]
Beispiel #8
0
        public void should_skip_till_unit_and_send_the_rest_to_children()
        {
            const string kind = "kind";

            var expected1 = new UnitId("expected", "expected");
            var expected2 = new UnitId("expected1l", "expected");

            // --arrange
            var target = new SkipTillUnit(new UnitPattern(kind));
            var child1 = A.Fake <IBuildChainPattern>();
            var child2 = A.Fake <IBuildChainPattern>();

            target.AddNode(child1);
            target.AddNode(child2);

            // --act
            var chain = new[] { new UnitId(1, null), new UnitId(2, null), new UnitId(kind, null), expected1, expected2 }.ToArrayTail();
            WeightedBuildActionBag?actionBag;

            target.GatherBuildActions(chain, out actionBag, 0);

            // --assert
            WeightedBuildActionBag?weightedBuildActionBag;

            A.CallTo(
                () => child1.GatherBuildActions(
                    An <BuildChain> .That.IsEqualTo(Util.MakeArrayTail(expected1, expected2), Comparer.OfArrayTail <UnitId>()),
                    out weightedBuildActionBag,
                    An <int> ._))
            .MustHaveHappenedOnceAndOnly();

            WeightedBuildActionBag?actionBag1;

            A.CallTo(
                () => child2.GatherBuildActions(
                    An <BuildChain> .That.IsEqualTo(Util.MakeArrayTail(expected1, expected2), Comparer.OfArrayTail <UnitId>()),
                    out actionBag1,
                    An <int> ._))
            .MustHaveHappenedOnceAndOnly();
        }