Exemple #1
0
        public static DbaseField Read(BinaryReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            var name        = new DbaseFieldName(reader.ReadRightPaddedString(11, char.MinValue));
            var typeOfField = reader.ReadByte();

            if (!Enum.IsDefined(typeof(DbaseFieldType), typeOfField))
            {
                var values          = Enum.GetValues(typeof(DbaseFieldType));
                var supportedValues = string.Join(
                    ",",
                    Enumerable
                    .Range(0, values.Length)
                    .Select(index =>
                            values.GetValue(index).ToString() + "[" + ((byte)values.GetValue(index)).ToString() + "]")
                    );

                throw new DbaseFileHeaderException(
                          $"The field type {typeOfField} of field {name} is not supported ({supportedValues}).");
            }

            var fieldType    = (DbaseFieldType)typeOfField;
            var offset       = new ByteOffset(reader.ReadInt32());
            var length       = new DbaseFieldLength(reader.ReadByte());
            var decimalCount = new DbaseDecimalCount(reader.ReadByte());

            reader.ReadBytes(14);

            return(new DbaseField(name, fieldType, offset, length, decimalCount));
        }
Exemple #2
0
        public DbaseSingle(DbaseField field, float?value = null) : base(field)
        {
            if (field == null)
            {
                throw new ArgumentNullException(nameof(field));
            }

            if (field.FieldType != DbaseFieldType.Float)
            {
                throw new ArgumentException(
                          $"The field {field.Name} 's type must be float to use it as a single field.", nameof(field));
            }

            if (field.Length < MinimumLength || field.Length > MaximumLength)
            {
                throw new ArgumentException(
                          $"The field {field.Name} 's length ({field.Length}) must be between {MinimumLength} and {MaximumLength}.",
                          nameof(field));
            }

            Provider = new NumberFormatInfo
            {
                NumberDecimalDigits    = DbaseDecimalCount.Min(MaximumDecimalCount, field.DecimalCount).ToInt32(),
                NumberDecimalSeparator = "."
            };

            Value = value;
        }
Exemple #3
0
 public static void CustomizeDbaseDecimalCount(this IFixture fixture, DbaseDecimalCount maximum)
 {
     fixture.Customize <DbaseDecimalCount>(
         customization =>
         customization.FromFactory <int>(
             value => new DbaseDecimalCount(value.AsDbaseDecimalCountValue(maximum.ToInt32()))
             ));
 }
Exemple #4
0
        public void ToInt32ReturnsExpectedValue()
        {
            var value = _fixture.Create <int>().AsDbaseDecimalCountValue();
            var sut   = new DbaseDecimalCount(value);

            var result = sut.ToInt32();

            Assert.Equal(value, result);
        }
Exemple #5
0
        public void LessThanOrEqualToDbaseDecimalCountOperatorReturnsExpectedValue(int left, int right, bool expected)
        {
            var sut   = new DbaseDecimalCount(left);
            var other = new DbaseDecimalCount(right);

            var result = sut <= other;

            Assert.Equal(expected, result);
        }
Exemple #6
0
        public void InequalityOperatorReturnsExpectedValue(int left, int right, bool expected)
        {
            var sut   = new DbaseDecimalCount(left);
            var other = new DbaseDecimalCount(right);

            var result = sut != other;

            Assert.Equal(expected, result);
        }
Exemple #7
0
        public void CompareToDbaseDecimalCountReturnsExpectedResult(int left, int right, int expected)
        {
            var sut   = new DbaseDecimalCount(left);
            var other = new DbaseDecimalCount(right);

            var result = sut.CompareTo(other);

            Assert.Equal(expected, result);
        }
        public void CreateSingleFieldThrowsWhenDecimalCountGreaterThanOrEqualToLength(int plus)
        {
            var name         = _fixture.Create <DbaseFieldName>();
            var length       = _fixture.GenerateDbaseSingleLength();
            var decimalCount = new DbaseDecimalCount(length.ToInt32()).Plus(new DbaseDecimalCount(plus));

            Assert.Throws <ArgumentException>(() => DbaseField.CreateSingleField(
                                                  name,
                                                  length,
                                                  decimalCount));
        }
        public void CreateSingleFieldThrowsWhenDecimalCountGreaterThanZeroAndLengthSmallerThan3(int smallerThan3)
        {
            var name         = _fixture.Create <DbaseFieldName>();
            var length       = new DbaseFieldLength(smallerThan3);
            var decimalCount = new DbaseDecimalCount(1);

            Assert.Throws <ArgumentException>(() => DbaseField.CreateSingleField(
                                                  name,
                                                  length,
                                                  decimalCount));
        }
        public bool AcceptsValue(float value)
        {
            if (Field.DecimalCount.ToInt32() == 0)
            {
                return(((float)Math.Truncate(value)).ToString("F", Provider).Length <= Field.Length.ToInt32());
            }

            var digits  = DbaseDecimalCount.Min(MaximumDecimalCount, Field.DecimalCount).ToInt32();
            var rounded = (float)Math.Round(value, digits);

            return(rounded.ToString("F", Provider).Length <= Field.Length.ToInt32());
        }
Exemple #11
0
        public void CreateNumberFieldFailsWhenDecimalCountIsNotZeroAndNotLessThanLengthMinus2(int minus)
        {
            var length       = _fixture.GenerateDbaseDoubleLength();
            var decimalCount = new DbaseDecimalCount(length.ToInt32()).Minus(new DbaseDecimalCount(minus));

            Assert.Throws <ArgumentException>(() =>
                                              new DbaseField(
                                                  _fixture.Create <DbaseFieldName>(),
                                                  DbaseFieldType.Number,
                                                  _fixture.Create <ByteOffset>(),
                                                  length,
                                                  decimalCount));
        }
Exemple #12
0
        public void CreateFloatFieldFailsWhenDecimalCountIsNotZeroAndNotLessThanOrEqualTo7(int decimals)
        {
            var length       = _fixture.Create <DbaseFieldLength>();
            var decimalCount = new DbaseDecimalCount(decimals);

            Assert.Throws <ArgumentException>(() =>
                                              new DbaseField(
                                                  _fixture.Create <DbaseFieldName>(),
                                                  DbaseFieldType.Float,
                                                  _fixture.Create <ByteOffset>(),
                                                  length,
                                                  decimalCount));
        }
Exemple #13
0
        private char[] GeneratePositiveNumber(DbaseIntegerDigits digits, DbaseDecimalCount decimals)
        {
            var data = new char[digits.ToInt32() + 1 + decimals.ToInt32()];

            for (var index = 0; index < digits.ToInt32(); index++)
            {
                data[index] = _random.Next(0, 10).ToString()[0];
            }
            data[digits.ToInt32()] = '.';
            for (var index = 0; index < decimals.ToInt32(); index++)
            {
                data[digits.ToInt32() + 1 + index] = _random.Next(0, 10).ToString()[0];
            }
            return(data);
        }
Exemple #14
0
        public static DbaseDecimalCount GenerateDbaseDoubleDecimalCount(this IFixture fixture,
                                                                        DbaseDecimalCount minimum, DbaseFieldLength length)
        {
            if (length > DbaseDouble.MaximumLength)
            {
                throw new ArgumentOutOfRangeException(nameof(length),
                                                      $"The length ({length}) can not exceed the maximum length ({DbaseDouble.MaximumLength}).");
            }

            using (var random = new PooledRandom())
            {
                return(new DbaseDecimalCount(random.Next(minimum.ToInt32(),
                                                         Math.Min(DbaseDouble.MaximumDecimalCount.ToInt32() + 1, length.ToInt32()) - 2)));
            }
        }
Exemple #15
0
        public bool AcceptsValue(double?value)
        {
            if (!value.HasValue)
            {
                return(true);
            }

            if (Field.DecimalCount.ToInt32() == 0)
            {
                return(Math.Truncate(value.Value).ToString("F", Provider).Length <= Field.Length.ToInt32());
            }

            var digits  = DbaseDecimalCount.Min(MaximumDecimalCount, Field.DecimalCount).ToInt32();
            var rounded = Math.Round(value.Value, digits);

            return(rounded.ToString("F", Provider).Length <= Field.Length.ToInt32());
        }
        public void CreateFailsIfFieldLengthIsOutOfRange(int outOfRange)
        {
            var length       = new DbaseFieldLength(outOfRange);
            var decimalCount = new DbaseDecimalCount(0);

            Assert.Throws <ArgumentException>(
                () =>
                new DbaseNumber(
                    new DbaseField(
                        _fixture.Create <DbaseFieldName>(),
                        DbaseFieldType.Number,
                        _fixture.Create <ByteOffset>(),
                        length,
                        decimalCount
                        )
                    )
                );
        }
        public void CanReadWriteWithMaxDecimalCount()
        {
            var length       = DbaseSingle.MaximumLength;
            var decimalCount = DbaseDecimalCount.Min(DbaseSingle.MaximumDecimalCount,
                                                     new DbaseDecimalCount(length.ToInt32() - 2));
            var sut =
                new DbaseSingle(
                    new DbaseField(
                        _fixture.Create <DbaseFieldName>(),
                        DbaseFieldType.Float,
                        _fixture.Create <ByteOffset>(),
                        length,
                        decimalCount
                        )
                    );

            using (var random = new PooledRandom())
            {
                sut.Value =
                    new DbaseFieldNumberGenerator(random)
                    .GenerateAcceptableValue(sut);

                using (var stream = new MemoryStream())
                {
                    using (var writer = new BinaryWriter(stream, Encoding.ASCII, true))
                    {
                        sut.Write(writer);
                        writer.Flush();
                    }

                    stream.Position = 0;

                    using (var reader = new BinaryReader(stream, Encoding.ASCII, true))
                    {
                        var result = new DbaseSingle(sut.Field);
                        result.Read(reader);

                        Assert.Equal(sut, result, new DbaseFieldValueEqualityComparer());
                    }
                }
            }
        }
Exemple #18
0
        public void CreateNumberFieldReturnsExpectedResultWhenDecimalCountIsZeroAndNotLessThanLengthMinus2()
        {
            var name         = _fixture.Create <DbaseFieldName>();
            var offset       = _fixture.Create <ByteOffset>();
            var length       = new DbaseFieldLength(1);
            var decimalCount = new DbaseDecimalCount(0);
            var result       =
                new DbaseField(
                    name,
                    DbaseFieldType.Number,
                    offset,
                    length,
                    decimalCount);

            Assert.Equal(name, result.Name);
            Assert.Equal(DbaseFieldType.Number, result.FieldType);
            Assert.Equal(offset, result.Offset);
            Assert.Equal(length, result.Length);
            Assert.Equal(decimalCount, result.DecimalCount);
            Assert.Equal(new DbaseIntegerDigits(1), result.PositiveIntegerDigits);
            Assert.Equal(new DbaseIntegerDigits(0), result.NegativeIntegerDigits);
        }
Exemple #19
0
        public void CreateCharacterFieldReturnsExpectedWhenDecimalCountIs0()
        {
            var name         = _fixture.Create <DbaseFieldName>();
            var offset       = _fixture.Create <ByteOffset>();
            var length       = _fixture.Create <DbaseFieldLength>();
            var decimalCount = new DbaseDecimalCount(0);
            var result       =
                new DbaseField(
                    name,
                    DbaseFieldType.Character,
                    offset,
                    length,
                    decimalCount);

            Assert.Equal(name, result.Name);
            Assert.Equal(DbaseFieldType.Character, result.FieldType);
            Assert.Equal(offset, result.Offset);
            Assert.Equal(length, result.Length);
            Assert.Equal(decimalCount, result.DecimalCount);
            Assert.Equal(new DbaseIntegerDigits(0), result.PositiveIntegerDigits);
            Assert.Equal(new DbaseIntegerDigits(0), result.NegativeIntegerDigits);
        }
Exemple #20
0
 public DbaseDecimalEqualityComparer(DbaseDecimalCount precision)
 {
     _precision = precision;
 }
Exemple #21
0
 public static DbaseField CreateNumberField(DbaseFieldName name, DbaseFieldLength length, DbaseDecimalCount decimalCount)
 => new DbaseField(name, DbaseFieldType.Number, ByteOffset.Initial, length, decimalCount);
Exemple #22
0
 public DbaseNullableDoubleEqualityComparer(DbaseDecimalCount precision)
 {
     _precision = precision;
 }
Exemple #23
0
        // public static DbaseField CreateDecimalField(DbaseFieldName name, DbaseFieldLength length,
        //     DbaseDecimalCount decimalCount)
        // {
        //     return new DbaseField(name, DbaseFieldType.Number, ByteOffset.Initial, length, decimalCount);
        // }

        public static DbaseField CreateDoubleField(DbaseFieldName name, DbaseFieldLength length,
                                                   DbaseDecimalCount decimalCount)
        {
            return(new DbaseField(name, DbaseFieldType.Number, ByteOffset.Initial, length, decimalCount));
        }
Exemple #24
0
        public void MinReturnsExpectedResult(int left, int right, int expected)
        {
            var result = DbaseDecimalCount.Min(new DbaseDecimalCount(left), new DbaseDecimalCount(right));

            Assert.Equal(new DbaseDecimalCount(expected), result);
        }
Exemple #25
0
            bool IEqualityComparer <object> .Equals(object left, object right)
            {
                if (left == null && right == null)
                {
                    return(true);
                }
                if (left == null || right == null)
                {
                    return(false);
                }

                if (left is double leftDouble && right is double rightDouble)
                {
                    var doubleDigits = DbaseDecimalCount.Min(_digits, DbaseDouble.MaximumDecimalCount).ToInt32();
                    var leftRounded  = Math.Round(leftDouble, doubleDigits);
                    var rightRounded = Math.Round(rightDouble, doubleDigits);
                    return(Math.Abs(leftRounded - rightRounded) <= Math.Pow(10, -doubleDigits));
                }

                if (left is double? && right is double?)
                {
                    var nullableLeft  = (double?)left;
                    var nullableRight = (double?)right;
                    if (!nullableLeft.HasValue && !nullableRight.HasValue)
                    {
                        return(true);
                    }
                    if (nullableLeft.HasValue || nullableRight.HasValue)
                    {
                        return(false);
                    }
                    var doubleDigits = DbaseDecimalCount.Min(_digits, DbaseDouble.MaximumDecimalCount).ToInt32();
                    var leftRounded  = Math.Round((double)nullableLeft.Value, doubleDigits);
                    var rightRounded = Math.Round((double)nullableRight.Value, doubleDigits);
                    return(Math.Abs(leftRounded - rightRounded) <= Math.Pow(10, -doubleDigits));
                }

                if (left is float leftSingle && right is float rightSingle)
                {
                    var singleDigits = DbaseDecimalCount.Min(_digits, DbaseSingle.MaximumDecimalCount).ToInt32();
                    var leftRounded  = Math.Round(leftSingle, singleDigits);
                    var rightRounded = Math.Round(rightSingle, singleDigits);
                    return(Math.Abs(leftRounded - rightRounded) <= Math.Pow(10, -singleDigits));
                }

                if (left is float? && right is float?)
                {
                    var nullableLeft  = (float?)left;
                    var nullableRight = (float?)right;
                    if (!nullableLeft.HasValue && !nullableRight.HasValue)
                    {
                        return(true);
                    }
                    if (nullableLeft.HasValue || nullableRight.HasValue)
                    {
                        return(false);
                    }
                    var singleDigits = DbaseDecimalCount.Min(_digits, DbaseSingle.MaximumDecimalCount).ToInt32();
                    var leftRounded  = Math.Round((float)nullableLeft.Value, singleDigits);
                    var rightRounded = Math.Round((float)nullableRight.Value, singleDigits);
                    return(Math.Abs(leftRounded - rightRounded) <= Math.Pow(10, -singleDigits));
                }

                return(Equals(left, right));
            }
Exemple #26
0
 public static DbaseField CreateSingleField(DbaseFieldName name, DbaseFieldLength length, DbaseDecimalCount decimalCount)
 => new DbaseField(name, DbaseFieldType.Float, ByteOffset.Initial, length, decimalCount);
Exemple #27
0
 public ComparerSelectingInspector(DbaseDecimalCount precision)
 {
     _precision = precision;
 }
Exemple #28
0
        public DbaseField(DbaseFieldName name, DbaseFieldType fieldType, ByteOffset offset, DbaseFieldLength length,
                          DbaseDecimalCount decimalCount)
        {
            if (!Enum.IsDefined(typeof(DbaseFieldType), fieldType))
            {
                throw new ArgumentException(
                          $"The field type {fieldType} of field {name} is not supported.",
                          nameof(fieldType));
            }

            switch (fieldType)
            {
            case DbaseFieldType.Character:
                if (decimalCount.ToInt32() != 0)
                {
                    throw new ArgumentException(
                              $"The character field {name} decimal count ({decimalCount}) must be set to 0.",
                              nameof(decimalCount));
                }

                break;

            case DbaseFieldType.DateTime:
                if (length.ToInt32() != 15)
                {
                    throw new ArgumentException($"The datetime field {name} length ({length}) must be set to 15.",
                                                nameof(length));
                }

                if (decimalCount.ToInt32() != 0)
                {
                    throw new ArgumentException(
                              $"The datetime field {name} decimal count ({decimalCount}) must be set to 0.",
                              nameof(decimalCount));
                }

                break;

            case DbaseFieldType.Number:
                if (length > DbaseDouble.MaximumLength)
                {
                    throw new ArgumentException(
                              $"The number field {name} length ({length}) must be less than or equal to {DbaseDouble.MaximumLength}.",
                              nameof(length));
                }

                if (decimalCount.ToInt32() != 0)
                {
                    if (length < DbaseDouble.MinimumLength)
                    {
                        throw new ArgumentException(
                                  $"The number field {name} length ({length}) must be at least {DbaseDouble.MinimumLength}.",
                                  nameof(length));
                    }

                    if (decimalCount > DbaseDouble.MaximumDecimalCount)
                    {
                        throw new ArgumentException(
                                  $"The number field {name} decimal count ({decimalCount}) must be less than or equal to {DbaseDouble.MaximumDecimalCount}.",
                                  nameof(decimalCount));
                    }

                    if (decimalCount.ToInt32() > length.ToInt32() - 2)
                    {
                        throw new ArgumentException(
                                  $"The number field {name} decimal count ({decimalCount}) must be 2 less than its length ({length}).",
                                  nameof(decimalCount));
                    }
                }

                break;

            case DbaseFieldType.Float:
                if (length > DbaseSingle.MaximumLength)
                {
                    throw new ArgumentException(
                              $"The float field {name} length ({length}) must be less than or equal to {DbaseSingle.MaximumLength}.",
                              nameof(length));
                }

                if (decimalCount.ToInt32() != 0)
                {
                    if (length < DbaseSingle.MinimumLength)
                    {
                        throw new ArgumentException(
                                  $"The number field {name} length ({length}) must be at least {DbaseSingle.MinimumLength}.",
                                  nameof(length));
                    }

                    if (decimalCount > DbaseSingle.MaximumDecimalCount)
                    {
                        throw new ArgumentException(
                                  $"The float field {name} decimal count ({decimalCount}) must be less than or equal to {DbaseSingle.MaximumDecimalCount}.",
                                  nameof(decimalCount));
                    }

                    if (decimalCount.ToInt32() > length.ToInt32() - 2)
                    {
                        throw new ArgumentException(
                                  $"The float field {name} decimal count ({decimalCount}) must be 2 less than its length ({length}).",
                                  nameof(decimalCount));
                    }
                }

                break;

            case DbaseFieldType.Logical:
                if (decimalCount.ToInt32() != 0)
                {
                    throw new ArgumentException(
                              $"The logical field {name} decimal count ({decimalCount}) must be set to 0.",
                              nameof(decimalCount));
                }

                if (length.ToInt32() != 1)
                {
                    throw new ArgumentException(
                              $"The logical field {name} length ({length}) must be set to 1.",
                              nameof(length));
                }

                break;
            }

            Name         = name;
            FieldType    = fieldType;
            Offset       = offset;
            Length       = length;
            DecimalCount = decimalCount;

            if (FieldType == DbaseFieldType.Number || FieldType == DbaseFieldType.Float)
            {
                PositiveIntegerDigits =
                    DecimalCount.ToInt32() != 0
                        ? new DbaseIntegerDigits(
                        Length
                        .Minus(DecimalCount.ToLength())
                        .Minus(DecimalSeparatorLength)
                        .ToInt32()
                        )
                        : new DbaseIntegerDigits(Length.ToInt32());

                NegativeIntegerDigits =
                    PositiveIntegerDigits != new DbaseIntegerDigits(0)
                        ? PositiveIntegerDigits
                    .Minus(SignLength)
                        : new DbaseIntegerDigits(0);
            }
            else
            {
                PositiveIntegerDigits = new DbaseIntegerDigits(0);
                NegativeIntegerDigits = new DbaseIntegerDigits(0);
            }
        }
Exemple #29
0
 public ObjectEqualityComparer(DbaseDecimalCount digits)
 {
     _digits = digits;
 }