public void LoadFromEmbeddedResourceOk()
        {
            //Act
            var loadResult = ISBNRangeMessage.LoadFromEmbeddedResource();

            //Assert
            loadResult.Unwrap();
        }
        public void LoadXmlInTreeSmokeTest()
        {
            var isbnRangeMessage =
                ISBNRangeMessage.LoadFromFile(TestContext.CurrentContext.TestDirectory + "\\ISBNRangeMessage.xml");

            var ruleTrees = PrefixTreeBuilder.BuildFromISBNRangeMessage(isbnRangeMessage);

            ruleTrees.Count.Should().Be(2);
        }
示例#3
0
        public void ISBN13Examples()
        {
            //Validate and get metadata from an ISBN-13
            var loadResult   = ISBNRangeMessage.LoadFromEmbeddedResource();
            var isbn13Parser = new ISBN13Parser(loadResult.Unwrap());

            var parseResult = isbn13Parser.Parse("9780671704278");

            //Unwrap (throws exception when result is an error)
            ISBN13.Metadata isbn13Metadata = parseResult.Unwrap();
            Console.WriteLine(isbn13Metadata.ToString());
            //: 978-0-671-70427-8

            //match: handle Err or Ok case
            parseResult.Match(
                err =>
            {
                //This is executed when the result is an error
                switch (err.ErrorKind)
                {
                case ISBNParseErrorKind.InvalidEan:
                    break;

                case ISBNParseErrorKind.NoMetadataFound:
                    break;

                case ISBNParseErrorKind.InvalidISBN13:
                    break;

                case ISBNParseErrorKind.InvalidISBN10:
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                return(err.Message);
            },
                metadata =>
            {
                //This is executed when the result is Ok
                Console.WriteLine($"ISBN13: {metadata.ToString()}, Country: {metadata.CountryAgency}");
                //: ISBN13: 978-0-671-70427-8, Country: English language

                //An isbn13 is a valid EAN13
                var ean13 = metadata.Ean;
                Console.WriteLine($"Code: {ean13.Ean13Code} Checksum: {ean13.Checksum}");
                //: Code: 9780671704278 Checksum: 8

                return(metadata.ToString());
            });

            //See: ISBN13MetaDataInfoTests for more examples
        }
示例#4
0
        public void ISBN13FromISBN10Examples()
        {
            var loadResult   = ISBNRangeMessage.LoadFromEmbeddedResource();
            var isbn13Parser = new ISBN13Parser(loadResult.Unwrap());

            var isbn10Str = "0306406152";

            Console.WriteLine(isbn13Parser.Parse(isbn10Str).Unwrap());
            //: 978-0-306-40615-7

            //Invalid ISBN10
            isbn13Parser.Parse("0306406199").MapErr(err =>
            {
                Console.WriteLine($"{err.Message}, {err.ErrorKind}");
                //: Input 0306406199 is not a valid ISBN10 number: InvalidChecksum, InvalidISBN10
                return(false);
            });
        }
示例#5
0
 public ISBN13Parser(ISBNRangeMessage rangeMessage)
 {
     _prefixTrees = PrefixTreeBuilder.BuildFromISBNRangeMessage(rangeMessage);
 }
示例#6
0
        public ISBN13ParserTests()
        {
            var loadResult = ISBNRangeMessage.LoadFromEmbeddedResource();

            _parser = new ISBN13Parser(loadResult.Unwrap());
        }
        public ISBN13MetaDataInfoTests()
        {
            var isbnRangeMessage = ISBNRangeMessage.LoadFromFile(TestContext.CurrentContext.TestDirectory + "\\ISBNRangeMessage.xml");

            _ruleTrees = PrefixTreeBuilder.BuildFromISBNRangeMessage(isbnRangeMessage);
        }
示例#8
0
        public static IReadOnlyDictionary <string, PrefixTree> BuildFromISBNRangeMessage(ISBNRangeMessage isbnRangeMessage)
        {
            if (isbnRangeMessage == null)
            {
                throw new ArgumentNullException(nameof(isbnRangeMessage));
            }

            if (isbnRangeMessage.EAN_UCCPrefixes?.EAN_UCC == null)
            {
                throw new ArgumentException("EAN_UCC is null in message.", nameof(isbnRangeMessage));
            }

            var rootPrefixTrees = new Dictionary <string, PrefixTree>(2, StringComparer.Ordinal);

            foreach (var eanUcc in isbnRangeMessage.EAN_UCCPrefixes.EAN_UCC)
            {
                if (eanUcc.Rules?.Rule == null)
                {
                    continue;
                }

                var mainRangeRules = new List <RangeRule>(eanUcc.Rules.Rule.Count);

                foreach (var rule in eanUcc.Rules.Rule)
                {
                    var numberOfDigits = rule.Length;
                    if (numberOfDigits > 0)
                    {
                        var ranges = rule.Range.Split('-', StringSplitOptions.RemoveEmptyEntries);
                        var from   = int.Parse(ranges[0].Substring(0, numberOfDigits));
                        var to     = int.Parse(ranges[1].Substring(0, numberOfDigits));

                        mainRangeRules.Add(new RangeRule(@from, to, numberOfDigits));
                    }
                }

                var mainPrefix = eanUcc.Prefix;
                var prefixTree = new PrefixTree(
                    mainPrefix,
                    eanUcc.Prefix.Length,
                    eanUcc.Agency,
                    mainRangeRules);

                rootPrefixTrees.Add(mainPrefix, prefixTree);
            }

            if (rootPrefixTrees.Count == 0)
            {
                throw new ArgumentException("Invalid data, the message does not contain any UCCPrefixes.",
                                            nameof(isbnRangeMessage));
            }

            var allGroups = isbnRangeMessage.RegistrationGroups?.Group;

            if (allGroups == null)
            {
                return(rootPrefixTrees);
            }

            for (var i = 0; i < allGroups.Count; i++)
            {
                var currentGroup    = allGroups[i];
                var groupPrefixes   = currentGroup.Prefix.Split('-', StringSplitOptions.RemoveEmptyEntries);
                var parentPrefixStr = groupPrefixes[0];
                var groupPrefixStr  = groupPrefixes[1];

                if (currentGroup.Rules?.Rule == null)
                {
                    continue;
                }

                var groupRules = new List <RangeRule>(currentGroup.Rules.Rule.Count);

                foreach (var rule in currentGroup.Rules.Rule)
                {
                    var numberOfDigits = rule.Length;
                    if (numberOfDigits > 0)
                    {
                        var ranges    = rule.Range.Split('-', StringSplitOptions.RemoveEmptyEntries);
                        var from      = int.Parse(ranges[0].Substring(0, numberOfDigits));
                        var to        = int.Parse(ranges[1].Substring(0, numberOfDigits));
                        var rangeRule = new RangeRule(@from, to, numberOfDigits);
                        groupRules.Add(rangeRule);
                    }
                }

                if (groupRules.Count > 0)
                {
                    if (!rootPrefixTrees[parentPrefixStr].AddChild(groupPrefixStr, groupPrefixStr.Length,
                                                                   currentGroup.Agency, groupRules))
                    {
                        throw new InvalidDataException(
                                  $"Could not add child {groupPrefixStr} to root {parentPrefixStr}.");
                    }
                }
            }

            return(rootPrefixTrees);
        }