Beispiel #1
0
        public void Modify()
        {
            var segment1 = new Segment("segment1", false);
            var segment2 = new Segment("segment2", false);

            ICollection <Segment> set = SegmentSet.New(new Segment[] { segment1 });

            Assert.That(set.IsReadOnly, Is.EqualTo(true));

            try
            {
                set.Add(segment2);
                Assert.Fail("Add should have thrown an exception.");
            }
            catch (NotSupportedException)
            {
            }

            try
            {
                set.Remove(segment1);
                Assert.Fail("Remove should have thrown an exception.");
            }
            catch (NotSupportedException)
            {
            }
        }
Beispiel #2
0
        private static Dictionary <string, SegmentSpecification> Get5010Spec()
        {
            lock (syncObject)
                if (_5010Specification == null)
                {
                    Stream       specStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("EdiFactory.Specifications.Ansi-5010Specification.xml");
                    StreamReader reader     = new StreamReader(specStream);
                    SegmentSet   set        = SegmentSet.Deserialize(reader.ReadToEnd());
                    _5010Specification = new Dictionary <string, SegmentSpecification>();
                    foreach (var segment in set.Segments)
                    {
                        foreach (var element in segment.Elements)
                        {
                            if (element.Type == ElementDataTypeEnum.Identifier && !string.IsNullOrEmpty(element.QualifierSetRef))
                            {
                                var qualifierSet = set.QualifierSets.FirstOrDefault(qs => qs.Name == element.QualifierSetRef);
                                if (qualifierSet != null)
                                {
                                    element.AllowedIdentifiers.AddRange(qualifierSet.AllowedIdentifiers);
                                    element.QualifierSetId = qualifierSet.Id;
                                }
                            }
                        }

                        _5010Specification.Add(segment.SegmentId, segment);
                    }
                }
            return(_5010Specification);
        }
Beispiel #3
0
        public void TrySubtractLookahead()
        {
            var set1 = ParseItemSet.New(new ParseItem[] { _item10, _item11, _item20 });

            var laA = SegmentSet.New(new Segment[] { _lookaheadA });
            var laB = SegmentSet.New(new Segment[] { _lookaheadB });
            var laC = SegmentSet.New(new Segment[] { _lookaheadC });

            var laAB  = SegmentSet.New(new Segment[] { _lookaheadA, _lookaheadB });
            var laBC  = SegmentSet.New(new Segment[] { _lookaheadB, _lookaheadC });
            var laABC = SegmentSet.New(new Segment[] { _lookaheadA, _lookaheadB, _lookaheadC });

            set1.SetLookahead(_item10, laAB);
            set1.SetLookahead(_item11, laBC);
            set1.SetLookahead(_item20, laABC);

            Assert.That(set1.GetLookahead(_item10), Is.EqualTo(laAB));
            Assert.That(set1.GetLookahead(_item11), Is.EqualTo(laBC));
            Assert.That(set1.GetLookahead(_item20), Is.EqualTo(laABC));

            set1.SubtractLookaheads(laB);

            Assert.That(set1.GetLookahead(_item10), Is.EqualTo(laA));
            Assert.That(set1.GetLookahead(_item11), Is.EqualTo(laC));
            Assert.That(set1.GetLookahead(_item20), Is.EqualTo(laA.Union(laC)));
        }
Beispiel #4
0
        public void TryUnionLookahead()
        {
            var set1 = ParseItemSet.New(new ParseItem[] { _item10, _item11, _item20 });

            var la1 = SegmentSet.New(new Segment[] { _lookaheadA, _lookaheadB });
            var la2 = SegmentSet.New(new Segment[] { _lookaheadB, _lookaheadC });
            var la3 = SegmentSet.New(new Segment[] { _lookaheadA, _lookaheadB, _lookaheadC });

            Assert.That(set1.GetLookahead(_item10), Is.EqualTo(SegmentSet.EmptySet));
            Assert.That(set1.GetLookahead(_item11), Is.EqualTo(SegmentSet.EmptySet));
            Assert.That(set1.GetLookahead(_item20), Is.EqualTo(SegmentSet.EmptySet));

            Assert.That(set1.TryUnionLookahead(_item10, la1), Is.EqualTo(true));
            Assert.That(set1.TryUnionLookahead(_item11, la1), Is.EqualTo(true));

            Assert.That(set1.GetLookahead(_item10), Is.EqualTo(la1));
            Assert.That(set1.GetLookahead(_item11), Is.EqualTo(la1));
            Assert.That(set1.GetLookahead(_item20), Is.EqualTo(SegmentSet.EmptySet));

            Assert.That(set1.TryUnionLookahead(_item10, la2), Is.EqualTo(true));

            Assert.That(set1.GetLookahead(_item10), Is.EqualTo(la3));
            Assert.That(set1.GetLookahead(_item11), Is.EqualTo(la1));
            Assert.That(set1.GetLookahead(_item20), Is.EqualTo(SegmentSet.EmptySet));

            Assert.That(set1.TryUnionLookahead(_item10, la1), Is.EqualTo(false));

            Assert.That(set1.GetLookahead(_item10), Is.EqualTo(la3));
            Assert.That(set1.GetLookahead(_item11), Is.EqualTo(la1));
            Assert.That(set1.GetLookahead(_item20), Is.EqualTo(SegmentSet.EmptySet));
        }
        public void SerializeSegmentSet()
        {
            SegmentSet set = new SegmentSet {
                Name = "4010"
            };
            SegmentSpecification isa = new SegmentSpecification {
                SegmentId = "ISA"
            };

            set.Segments.Add(isa);
            isa.Elements.Add(new ElementSpecification
            {
                Name      = "Author Info Qualifier",
                Required  = true,
                MinLength = 2,
                MaxLength = 2,
                Type      = ElementDataTypeEnum.Identifier
            });
            string xml = set.Serialize();

            Trace.Write(xml);
            SegmentSet           copy    = SegmentSet.Deserialize(xml);
            SegmentSpecification isaCopy = copy.Segments.FirstOrDefault(s => s.SegmentId == "ISA");

            Assert.IsNotNull(isaCopy);
            Assert.AreEqual("ISA", isaCopy.SegmentId);
            Assert.AreEqual("Author Info Qualifier", isaCopy.Elements[0].Name);
            Assert.AreEqual(2, isaCopy.Elements[0].MinLength);
        }
Beispiel #6
0
        public void Intersect_Reuse()
        {
            var segment1 = new Segment("Segment1", false);
            var segment2 = new Segment("Segment2", false);

            var set1 = SegmentSet.New(new Segment[] { segment1, segment2 });
            var set2 = SegmentSet.New(new Segment[] { segment1 });

            Assert.That(set1.Intersection(set2), Is.SameAs(set2));
            Assert.That(set2.Intersection(set1), Is.SameAs(set2));
        }
Beispiel #7
0
        public void Subtract_Reuse()
        {
            var segment1 = new Segment("Segment1", false);
            var segment2 = new Segment("Segment2", false);

            var set1 = SegmentSet.New(new Segment[] { segment1 });
            var set2 = SegmentSet.New(new Segment[] { segment2 });

            Assert.That(set1.Subtract(set2), Is.SameAs(set1));
            Assert.That(set2.Subtract(set1), Is.SameAs(set2));
        }
Beispiel #8
0
        public void ToStringX()
        {
            var set1 = SegmentSet.New(new Segment[] { new Segment("a", true) });
            var set2 = SegmentSet.New(new Segment[] { new Segment("A", false) });

            Assert.That(SegmentSet.EmptySet.ToString(), Is.EqualTo(string.Empty));

            Assert.That(SegmentSet.EpsilonSet.ToString(), Is.EqualTo("null"));
            Assert.That(set1.ToString(), Is.EqualTo("a"));
            Assert.That(set2.ToString(), Is.EqualTo("<A>"));

            Assert.That(set1.Union(set2).Union(SegmentSet.EpsilonSet).ToString(), Is.EqualTo("null a <A>"));
        }
Beispiel #9
0
        public void Intersect()
        {
            var segment1 = new Segment("segment1", false);
            var segment2 = new Segment("segment2", false);
            var segment3 = new Segment("segment3", false);
            var segment4 = new Segment("segment4", false);

            var a = SegmentSet.New(new Segment[] { segment1, segment2 });
            var b = SegmentSet.New(new Segment[] { segment2, segment3 });
            var x = a.Intersection(b);

            Assert.That(x.ContainsSegment(segment1), Is.EqualTo(false), "segment1");
            Assert.That(x.ContainsSegment(segment2), Is.EqualTo(true), "segment2");
            Assert.That(x.ContainsSegment(segment3), Is.EqualTo(false), "segment3");
            Assert.That(x.ContainsSegment(segment4), Is.EqualTo(false), "segment4");
        }
        void PopulateTopLevelSegments()
        {
            if (_config.EntryPoints.Count > 0)
            {
                var segments = new Dictionary <Segment, bool>();

                foreach (var entryPoint in _config.EntryPoints)
                {
                    var segment = GetNonTerminal(entryPoint.NonTerminal.Text);
                    entryPoint.Segment = segment;

                    if (_ntTypes.TryGetValue(segment, out var cUsing))
                    {
                        entryPoint.Using = cUsing;
                    }

                    if (segments.ContainsKey(segment))
                    {
                        ReporterHelper.AddWarning(_reporter, entryPoint.NonTerminal, "The non-terminal <{0}> is already an entry point.", entryPoint.NonTerminal.Text);
                    }
                    else
                    {
                        segments.Add(segment, true);
                    }
                }

                _config.TopLevelSegments = SegmentSet.New(segments.Keys);
            }
            else if (_config.Productions.Count > 0)
            {
                _config.TopLevelSegments = SegmentSet.New(new Segment[]
                {
                    _config.Productions[0].Segment,
                });

                _config.EntryPoints.Add(new ConfigEntryPoint()
                {
                    Segment     = _config.Productions[0].Segment,
                    NonTerminal = _config.Productions[0].Target,
                    Using       = _config.Productions[0].Using,
                });
            }
            else
            {
                _config.TopLevelSegments = SegmentSet.EmptySet;
            }
        }
Beispiel #11
0
        public void CopyTo()
        {
            var segment1 = new Segment("segment1", false);
            var segment2 = new Segment("segment2", false);
            var segment3 = new Segment("segment3", false);

            var set = SegmentSet.New(new Segment[] { segment1, segment2, segment3 });

            var segments1 = new Segment[set.Count];

            set.CopyTo(segments1, 0);
            Assert.That(segments1, Is.EqualTo(new Segment[] { segment1, segment2, segment3 }));

            var segments2 = new Segment[set.Count + 2];

            set.CopyTo(segments2, 1);
            Assert.That(segments2, Is.EqualTo(new Segment[] { null, segment1, segment2, segment3, null }));
        }
Beispiel #12
0
        public void New()
        {
            var segment1 = new Segment("segment1", true);
            var segment2 = new Segment("segment2", true);

            var set1 = SegmentSet.New(new Segment[] { segment1, segment2, segment2 });
            var set2 = SegmentSet.New(new Segment[] { segment2, segment1 });
            var set3 = SegmentSet.New(new Segment[] { segment2, segment2 });

            Assert.That(set1.Equals(set2), Is.EqualTo(true));
            Assert.That(set2.Equals(set1), Is.EqualTo(true));

            Assert.That(set1.Equals(set3), Is.EqualTo(false));
            Assert.That(set3.Equals(set1), Is.EqualTo(false));

            Assert.That(set2.Equals(set3), Is.EqualTo(false));
            Assert.That(set3.Equals(set2), Is.EqualTo(false));
        }
Beispiel #13
0
        public void IsSuperSetOf()
        {
            var segment1 = new Segment("segment1", false);
            var segment2 = new Segment("segment2", false);
            var segment3 = new Segment("segment3", false);
            var segment4 = new Segment("segment4", false);

            var set1 = SegmentSet.New(new Segment[] { segment1 });
            var set2 = SegmentSet.New(new Segment[] { segment1, segment2 });
            var set3 = SegmentSet.New(new Segment[] { segment2, segment3, segment4 });

            Assert.That(set1.IsSupersetOf(set2), Is.EqualTo(false));
            Assert.That(set1.IsSupersetOf(set3), Is.EqualTo(false));

            Assert.That(set2.IsSupersetOf(set1), Is.EqualTo(true));
            Assert.That(set2.IsSupersetOf(set3), Is.EqualTo(false));

            Assert.That(set3.IsSupersetOf(set1), Is.EqualTo(false));
            Assert.That(set3.IsSupersetOf(set2), Is.EqualTo(false));
        }
Beispiel #14
0
        Config ConstructSample2()
        {
            /*
             * S    := "id"
             *      | V ":=" E
             *
             * V    := "id"
             *
             * E    := V
             *      | "n"
             */

            var s = new Segment("S", false);
            var v = new Segment("V", false);
            var e = new Segment("E", false);

            var id     = new Segment("id", true);
            var assign = new Segment(":=", true);
            var n      = new Segment("n", true);

            return(new Config()
            {
                TopLevelSegments = SegmentSet.New(new Segment[] { s, e, }),
                Productions =
                {
                    new ConfigProduction()
                    {
                        Target = new ConfigToken(ConfigTokenType.NonTerminal, null, null, "S"),
                        Segment = s,
                        Rules =
                        {
                            new ConfigRule()
                            {
                                Segments =
                                {
                                    new ConfigSegment()
                                    {
                                        Token = new ConfigToken(ConfigTokenType.Label, null, null, "id"),
                                        Segment = id,
                                    },
                                },
                                Production = new Production(s, ImmutableArray.Create(id)),
                            },
                            new ConfigRule()
                            {
                                Segments =
                                {
                                    new ConfigSegment()
                                    {
                                        Token = new ConfigToken(ConfigTokenType.NonTerminal, null, null, "V"),
                                        Segment = v,
                                    },
                                    new ConfigSegment()
                                    {
                                        Token = new ConfigToken(ConfigTokenType.Label, null, null, ":="),
                                        Segment = assign,
                                    },
                                    new ConfigSegment()
                                    {
                                        Token = new ConfigToken(ConfigTokenType.NonTerminal, null, null, "E"),
                                        Segment = e,
                                    },
                                },
                                Production = new Production(s, ImmutableArray.Create(v, assign, e)),
                            },
                        },
                    },
                    new ConfigProduction()
                    {
                        Target = new ConfigToken(ConfigTokenType.NonTerminal, null, null, "V"),
                        Segment = v,
                        Rules =
                        {
                            new ConfigRule()
                            {
                                Segments =
                                {
                                    new ConfigSegment()
                                    {
                                        Token = new ConfigToken(ConfigTokenType.Label, null, null, "id"),
                                        Segment = id,
                                    },
                                },
                                Production = new Production(v, ImmutableArray.Create(id)),
                            },
                        },
                    },
                    new ConfigProduction()
                    {
                        Target = new ConfigToken(ConfigTokenType.NonTerminal, null, null, "E"),
                        Segment = e,
                        Rules =
                        {
                            new ConfigRule()
                            {
                                Segments =
                                {
                                    new ConfigSegment()
                                    {
                                        Token = new ConfigToken(ConfigTokenType.NonTerminal, null, null, "V"),
                                        Segment = v,
                                    },
                                },
                                Production = new Production(e, ImmutableArray.Create(v)),
                            },
                            new ConfigRule()
                            {
                                Segments =
                                {
                                    new ConfigSegment()
                                    {
                                        Token = new ConfigToken(ConfigTokenType.Label, null, null, "n"),
                                        Segment = n,
                                    },
                                },
                                Production = new Production(e, ImmutableArray.Create(n)),
                            },
                        },
                    },
                },
            });
        }
Beispiel #15
0
        Config ConstructSample1()
        {
            /*
             * A    := "(" A ")"
             *      | "a"
             */

            var nonTerminal = new Segment("A", false);
            var terminal    = new Segment("a", true);
            var openParen   = new Segment("(", true);
            var closeParen  = new Segment(")", true);

            return(new Config()
            {
                TopLevelSegments = SegmentSet.New(new Segment[] { nonTerminal }),
                Productions =
                {
                    new ConfigProduction()
                    {
                        Target = new ConfigToken(ConfigTokenType.NonTerminal, null, null, "A"),
                        Segment = nonTerminal,
                        Rules =
                        {
                            new ConfigRule()
                            {
                                Segments =
                                {
                                    new ConfigSegment()
                                    {
                                        Token = new ConfigToken(ConfigTokenType.Label, null, null, "("),
                                        Segment = openParen,
                                    },
                                    new ConfigSegment()
                                    {
                                        Token = new ConfigToken(ConfigTokenType.NonTerminal, null, null, "A"),
                                        Segment = nonTerminal,
                                    },
                                    new ConfigSegment()
                                    {
                                        Token = new ConfigToken(ConfigTokenType.Label, null, null, ")"),
                                        Segment = closeParen,
                                    },
                                },
                                Production = new Production(nonTerminal, ImmutableArray.Create(openParen, nonTerminal, closeParen)),
                            },
                            new ConfigRule()
                            {
                                Segments =
                                {
                                    new ConfigSegment()
                                    {
                                        Token = new ConfigToken(ConfigTokenType.Label, null, null, "a"),
                                        Segment = terminal,
                                    },
                                },
                                Production = new Production(nonTerminal, ImmutableArray.Create(terminal)),
                            },
                        },
                    },
                },
            });
        }