diff --git a/IdGen/IdGenerator.cs b/IdGen/IdGenerator.cs index 6da2173..2a7d907 100644 --- a/IdGen/IdGenerator.cs +++ b/IdGen/IdGenerator.cs @@ -55,11 +55,11 @@ public IdGenerator(int generatorId, IdGeneratorOptions options) _generatorid = generatorId; Options = options ?? throw new ArgumentNullException(nameof(options)); - var maxgeneratorid = 1U << Options.IdStructure.GeneratorIdBits; + var maxgeneratorid = (1U << Options.IdStructure.GeneratorIdBits) - 1; - if (_generatorid < 0 || _generatorid >= maxgeneratorid) + if (_generatorid < 0 || _generatorid > maxgeneratorid) { - throw new ArgumentOutOfRangeException(nameof(generatorId), $"GeneratorId must be between 0 and {maxgeneratorid - 1}."); + throw new ArgumentOutOfRangeException(nameof(generatorId), $"GeneratorId must be from 0 to {maxgeneratorid}."); } // Precalculate some values diff --git a/IdGenTests/IdGeneratorTests.cs b/IdGenTests/IdGeneratorTests.cs index 64e2529..d676a10 100644 --- a/IdGenTests/IdGeneratorTests.cs +++ b/IdGenTests/IdGeneratorTests.cs @@ -78,16 +78,36 @@ public void GeneratorId_ShouldBeMasked_WhenReadFromProperty() Assert.AreEqual((1 << g.Options.IdStructure.GeneratorIdBits) - 1, g.Id); } + [TestMethod] + public void Constructor_DoesNotThrow_OnMaxGeneratorId() + { + var structure = new IdStructure(41, 10, 12); + // 1023 is the max generator id for 10 bits. + var maxgeneratorid = 1023; + new IdGenerator(maxgeneratorid, new IdGeneratorOptions(structure)); + } + + [TestMethod] + public void Constructor_DoesNotThrow_OnGeneratorId_0() + { + new IdGenerator(0, new IdGeneratorOptions(new IdStructure(41, 10, 12))); + } + [TestMethod] [ExpectedException(typeof(ArgumentNullException))] public void Constructor_Throws_OnNull_Options() => new IdGenerator(1024, null!); - [TestMethod] [ExpectedException(typeof(ArgumentOutOfRangeException))] - public void Constructor_Throws_OnInvalidGeneratorId_Positive() - => new IdGenerator(1024, new IdGeneratorOptions(new IdStructure(41, 10, 12))); + public void Constructor_Throws_OnInvalidGeneratorId_Positive_MaxPlusOne() + { + var structure = new IdStructure(41, 10, 12); + // 1023 is the max generator id for 10 bits. + var maxgeneratorid = 1023; + int maxPlusOne = maxgeneratorid + 1; + new IdGenerator(maxPlusOne, new IdGeneratorOptions(structure)); + } [TestMethod] [ExpectedException(typeof(ArgumentOutOfRangeException))]