-
Notifications
You must be signed in to change notification settings - Fork 282
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Бабин Георгий #240
base: master
Are you sure you want to change the base?
Бабин Георгий #240
Changes from 6 commits
e5c6bb5
3deaa3c
d100a68
5ec33cb
b0124c5
f0d9880
8478ac8
6cb0cc9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
using System; | ||
using System.Text.RegularExpressions; | ||
|
||
namespace HomeExercises.NumberValidator | ||
{ | ||
public class NumberValidator | ||
{ | ||
private readonly Regex numberRegex; | ||
private readonly bool onlyPositive; | ||
private readonly int precision; | ||
private readonly int scale; | ||
|
||
public NumberValidator(int precision, int scale = 0, bool onlyPositive = false) | ||
{ | ||
this.precision = precision; | ||
this.scale = scale; | ||
this.onlyPositive = onlyPositive; | ||
if (precision <= 0) | ||
throw new ArgumentException("precision must be a positive number"); | ||
if (scale < 0 || scale >= precision) | ||
throw new ArgumentException("precision must be a non-negative number less or equal than precision"); | ||
numberRegex = new Regex(@"^([+-]?)(\d+)([.,](\d+))?$", RegexOptions.IgnoreCase); | ||
} | ||
|
||
public bool IsValidNumber(string value) | ||
{ | ||
// Проверяем соответствие входного значения формату N(m,k), в соответствии с правилом, | ||
// описанным в Формате описи документов, направляемых в налоговый орган в электронном виде по телекоммуникационным каналам связи: | ||
// Формат числового значения указывается в виде N(m.к), где m – максимальное количество знаков в числе, включая знак (для отрицательного числа), | ||
// целую и дробную часть числа без разделяющей десятичной точки, k – максимальное число знаков дробной части числа. | ||
// Если число знаков дробной части числа равно 0 (т.е. число целое), то формат числового значения имеет вид N(m). | ||
|
||
if (string.IsNullOrEmpty(value)) | ||
return false; | ||
|
||
var match = numberRegex.Match(value); | ||
if (!match.Success) | ||
return false; | ||
|
||
// Знак и целая часть | ||
var intPart = match.Groups[1].Value.Length + match.Groups[2].Value.Length; | ||
// Дробная часть | ||
var fracPart = match.Groups[4].Value.Length; | ||
|
||
if (intPart + fracPart > precision || fracPart > scale) | ||
return false; | ||
|
||
if (onlyPositive && match.Groups[1].Value == "-") | ||
return false; | ||
return true; | ||
} | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
using System; | ||
using FluentAssertions; | ||
using NUnit.Framework; | ||
|
||
namespace HomeExercises.NumberValidator | ||
{ | ||
public class NumberValidatorTests | ||
{ | ||
[TestCase(0, 2, false, TestName = "precision is zero")] | ||
[TestCase(-1, 2, false, TestName = "precision is negative")] | ||
[TestCase(1, -1, false, TestName = "scale is negative")] | ||
[TestCase(1, 2, false, TestName = "scale is greater than precision")] | ||
[TestCase(1, 1, false, TestName = "scale is equals precision")] | ||
public void Constructor_Fails_OnIncorrectArguments(int precision, int scale, bool onlyPositive) | ||
{ | ||
Action a = () => { new NumberValidator(precision, scale, onlyPositive); }; | ||
a.Should().Throw<ArgumentException>(); | ||
} | ||
|
||
[Test] | ||
public void Constructor_Success_WithThreeArguments() | ||
{ | ||
Action a = () => { new NumberValidator(1, 0, false); }; | ||
a.Should().NotThrow(); | ||
} | ||
|
||
[Test] | ||
public void Constructor_Success_WithTwoArguments() | ||
{ | ||
Action a = () => { new NumberValidator(1, 0); }; | ||
a.Should().NotThrow(); | ||
} | ||
|
||
[Test] | ||
public void Constructor_Success_WithOneArgument() | ||
{ | ||
Action a = () => { new NumberValidator(1); }; | ||
a.Should().NotThrow(); | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Второй и третий аргумент совпадает с аргументами по умолчанию - те же значения, поэтому нет разницы - вызовешь ты конструктор явно с тремя аргументами, как в первом тесте, либо с одним, как в последнем, результат один и тот же. Поэтому тесты можно схлопнуть в один с |
||
|
||
[TestCase(3, 2, true, null, TestName = "value is null")] | ||
[TestCase(3, 2, true, "", TestName = "value is empty")] | ||
[TestCase(3, 2, true, " ", TestName = "value is space")] | ||
[TestCase(3, 2, true, "+1..23", TestName = "value contains two separators")] | ||
[TestCase(3, 2, true, "++0", TestName = "value contains two signs")] | ||
[TestCase(3, 2, true, "1.2a", TestName = "value contains letters")] | ||
[TestCase(3, 2, true, "+", TestName = "value only contains sign")] | ||
[TestCase(3, 2, true, "0?0", TestName = "value separated by other symbol than dot or comma")] | ||
[TestCase(3, 2, true, " 0", TestName = "value contains spaces before number")] | ||
[TestCase(3, 2, true, "0 ", TestName = "value contains spaces after number")] | ||
[TestCase(3, 2, true, "0.", TestName = "value hasn't contains numbers after separator")] | ||
[TestCase(3, 2, true, ".0", TestName = "value hasn't contains numbers before separator")] | ||
[TestCase(17, 2, true, "0.000", TestName = "value's fraction part length is greater than scale")] | ||
[TestCase(5, 2, true, "-0.00", TestName = "negative sign when onlyPositive is true")] | ||
[TestCase(3, 2, true, "+0.00", TestName = "intPart and fractPart together is greater than precision")] | ||
public void IsValidNumber_ReturnsFalse_OnIncorrectArguments(int precision, int scale, bool onlyPositive, string value) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. А если разрешены только положительные, а передаем отрицательное? |
||
{ | ||
new NumberValidator(precision, scale, onlyPositive) | ||
.IsValidNumber(value) | ||
.Should() | ||
.BeFalse(); | ||
} | ||
|
||
[TestCase(17, 2, true, "0", TestName = "value without sign")] | ||
[TestCase(17, 2, true, "+0", TestName = "value with positive sign")] | ||
[TestCase(17, 2, false, "-0", TestName = "value with negative sign")] | ||
[TestCase(17, 2, true, "0.0", TestName = "value with period as delimiter")] | ||
[TestCase(17, 2, true, "0,0", TestName = "value with comma as delimiter")] | ||
[TestCase(17, 2, true, "+0,0", TestName = "value with sign and delimiter")] | ||
[TestCase(40, 20, true, "1234567890", TestName = "value with different numbers")] | ||
public void IsValidNumber_ReturnsTrue_OnCorrectArguments(int precision, int scale, bool onlyPositive, string value) | ||
{ | ||
new NumberValidator(precision, scale, onlyPositive) | ||
.IsValidNumber(value) | ||
.Should() | ||
.BeTrue(); | ||
} | ||
} | ||
} |
This file was deleted.
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
namespace HomeExercises | ||
{ | ||
public class Person | ||
{ | ||
public static int IdCounter = 0; | ||
public int Age, Height, Weight; | ||
public string Name; | ||
public Person? Parent; | ||
public int Id; | ||
|
||
public Person(string name, int age, int height, int weight, Person? parent) | ||
{ | ||
Id = IdCounter++; | ||
Name = name; | ||
Age = age; | ||
Height = height; | ||
Weight = weight; | ||
Parent = parent; | ||
} | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
namespace HomeExercises.TsarRegistry | ||
{ | ||
public class TsarRegistry | ||
{ | ||
public static Person GetCurrentTsar() | ||
{ | ||
return new Person("Ivan IV The Terrible", 54, 170, 70, | ||
new Person("Vasili III of Russia", 28, 170, 60, null)); | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
По факту onlyPositive сейчас не используется, т.к. никак не влияет на результаты работы теста и всегда false