示例#1
0
 public void Add(ResolveFailure fail)
 {
     foreach (KeyValuePair <ResolveFailureReason, bool> entry in fail.reasons)
     {
         Add(entry.Key);
     }
 }
示例#2
0
        public void ResolveResultSingleOrDefault_ignores_failures()
        {
            var expected = new ResolveFailure(Mock.Of <IResolveBuilder>(), "4242");

            var result = new ResolveResultSingleOrDefault <Int32>()
            {
                Results         = new[] { 42 },
                ResolveFailures = new[]
                {
                    expected
                }
            };

            Assert.Equal(42, result.Value);
            Assert.True(result.HasValue);
        }
示例#3
0
        public void ResolveResultSingle_throws_on_failures()
        {
            var expected = new ResolveFailure(Mock.Of <IResolveBuilder>(), "4242");

            var result = new ResolveResultSingle <Int32>()
            {
                Results         = new[] { 42 },
                ResolveFailures = new[]
                {
                    expected
                }
            };

            var exc = Assert.Throws <ResolveFailedException>(() => result.Value);
            var rf  = Assert.Single(exc.Failures);

            Assert.Same(expected, rf);
        }
示例#4
0
        private static List <Schematic> resolveImpl(sharptest.ModLibrary library, Schematic here, Dictionary <int, bool> seen, int elmKey)
        {
            if (seen.ContainsKey(elmKey))
            {
                return new List <Schematic> {
                           here
                }
            }
            ;
            if (!here.contents.ContainsKey(elmKey))
            {
                throw new ApplicationException("couldn't kind elmKey in contents");
            }
            Element elm = here.contents[elmKey];

            seen.Add(elmKey, true);
            try
            {
                List <Schematic> answers = new List <Schematic>();
                ResolveFailure   failure = new ResolveFailure();
                if (elm.availObjects.Count == 0)
                {
                    failure.Add(new CannotResolveElement(elm));
                }
                foreach (signals.ICircuitConnectible avail in elm.availObjects)
                {
                    Schematic newSchem = here.Clone();
                    Element   newElem  = newSchem.contents[elmKey];
                    newElem.availObjects.Clear();
                    newElem.availObjects.Add(avail);

                    try
                    {
                        newSchem.resolveNeighbors(library, newElem);
                    }
                    catch (ResolveFailureReason fault)
                    {
                        failure.Add(fault);
                        continue;
                    }

                    Dictionary <int, bool> recurseList = new Dictionary <int, bool>();
                    foreach (KeyValuePair <EndpointKey, EndpointKey> entry in newSchem.connections)
                    {
                        EndpointKey key   = entry.Key;
                        EndpointKey value = entry.Value;
                        if (key.elem == newElem)
                        {
                            if (!seen.ContainsKey(value.elem.circuitId))
                            {
                                recurseList.Add(value.elem.circuitId, true);
                            }
                        }
                        else if (value.elem == newElem)
                        {
                            if (!seen.ContainsKey(key.elem.circuitId))
                            {
                                recurseList.Add(key.elem.circuitId, true);
                            }
                        }
                    }
                    List <Schematic> possibles = new List <Schematic>();
                    possibles.Add(newSchem);
                    foreach (KeyValuePair <int, bool> entry in recurseList)
                    {
                        List <Schematic> prevPass = possibles;
                        possibles = new List <Schematic>();
                        foreach (Schematic possible in prevPass)
                        {
                            try
                            {
                                possibles.AddRange(resolveImpl(library, possible, seen, entry.Key));
                            }
                            catch (ResolveFailure fail)
                            {
                                failure.Add(fail);
                            }
                        }
                    }
                    answers.AddRange(possibles);
                }
                if (answers.Count == 0 && failure.reasons.Count > 0)
                {
                    throw failure;
                }
                return(answers);
            }
            finally
            {
                seen.Remove(elmKey);
            }
        }