
рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдЕрднреНрдпрд╛рд╕ рдореЗрдВ, рдЕрдХреНрд╕рд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐ рдореЗрдВ рдХрдИ рдЬреЛрд░ рджреЗрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реЛрддреА рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рджреЛ рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рд╕реЗ рдЖрд▓реЛрдЪрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдкрд╣рд▓рд╛, рд╢рдмреНрджрд╛рд░реНрде, рдПрдХ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдорд╛рдорд▓реЗ рдХреА рдЬрд╛рдБрдЪ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдмрдврд╝рдиреА рдЪрд╛рд╣рд┐рдПред рджреВрд╕рд░реА рдмрд╛рдд, рдпрджрд┐ рдХреЛрдИ рдЕрд╕реЗрд╕рд░реАрдЬ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЖрддреА рд╣реИ, рддреЛ рдкрд░реАрдХреНрд╖рд╛ рдмрд╛рдзрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧреА рдФрд░ рд╣рдо рдХреЗрд╡рд▓ рдЙрд╕рдореЗрдВ рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджреЗрдЦреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рднреА рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗрдЧрд╛, рдЬреЛ рд╣реБрдЖ рдЙрд╕рдХреА рдкреВрд░реА рддрд╕реНрд╡реАрд░ рдирд╣реАрдВ рджреЗрдЧрд╛ред рдкрд╣рд▓рд╛ рддрд░реНрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдЪрд┐рдд рд╣реИ рдФрд░ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╕рдордп рд╣рдореЗрд╢рд╛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдХрдЯреНрдЯрд░рдкрдВрдереА рдкрд╛рд▓рди рдЕрдХреНрд╕рд░ рдЙрдЪрд┐рдд рдирд╣реАрдВ рд▓рдЧрддрд╛ (рдиреАрдЪреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг)ред рдпрд╣ рдкрдж рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЙрдиреНрдореВрд▓рди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИред рдПрдХ рдЫреЛрдЯрд╛ рд╡рд░реНрдЧ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдЖрдкрдХреЛ рд╡рд┐рдзрд┐ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдмрд╕ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рддреЛ, рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЖрдХрд╛рд░ рд╡рд░реНрдЧ рд╣реИ, рдЬреЛ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЗрдВрдЪ рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдкреВрд░реЗ рдкреИрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╢реЗрд╖ рдЗрдВрдЪ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕реЗрд╕рд░реНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдпрд╛рдиреА рдЗрдирдкреБрдЯ рдореЗрдВ 16 рдкрд╛рд╕ рдХрд░рдиреЗ рдкрд░, рд╣рдореЗрдВ 1 рдлреАрдЯ рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ 4 рдЗрдВрдЪ (рдПрдХ рдкреИрд░ рдореЗрдВ 12 рдЗрдВрдЪ)ред
public class Size { public int Feet { get; private set; } public int RemainderInches { get; private set; } public Size(int totalInches) {
рдкреЗрдбрд╝ рдкрд░ рдбрд┐рдЬрд╛рдЗрдирд░ рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдкреНрд░рд╕рд╛рд░ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рдХрд╡рд░реЗрдЬ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:
[Test] public void ConstructorSuccess() { var zeroSize = new Size(0); var inchesOnlySize = new Size(2); var mixedSize = new Size(15); var feetOnlySize = new Size(36); Assert.That(zeroSize.Feet == 0 && zeroSize.RemainderInches == 0, "Zero size"); Assert.That(inchesOnlySize.Feet == 0 && inchesOnlySize.RemainderInches == 2, "Inches-only size"); Assert.That(mixedSize.Feet == 1 && mixedSize.RemainderInches == 3, "Inches and feet size"); Assert.That(feetOnlySize.Feet == 3 && feetOnlySize.RemainderInches == 0, "Feet-only size"); }
рдбрд┐рд╕реНрдХреНрд▓реЗрдорд░: рдХреЗрд╡рд▓ рд╕рддреНрдп рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рджреЛ рдЪреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЪреНрдЫрд╛ рднреА рд╣реЛрдЧрд╛), рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХреЛрдб рдЬрдЯрд┐рд▓ рд╣реЛрдЧрд╛ред
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддреНрдпреЗрдХ рдРрд╕реЗ рдЕрднрд┐рдХрдерди рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рд╡рд░реНрдЧ рдЬрд▓реНрджреА рд╕реЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд░реАрдХреЛрдВ рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдЧрд╛ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реИрдХрдбрд╝реЛрдВ рдкрд░реАрдХреНрд╖рдг рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдЕрдзрд┐рдХ рд╕рдордЭ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рджрд┐рдЦрд╛рдП рдЧрдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрдм рдПрдХ рдЬреЛрд░ рдкрдбрд╝рддрд╛ рд╣реИ, рддреЛ рд╣рдо рджреВрд╕рд░реЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдзрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рд╣рдо рдЗрд╕ рдЕрд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред
NUnit рдореЗрдВ, рдЬрдм рдХреЛрдИ рднреА рдЕрдирдХреИрдкреНрдб рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рд╡рд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ Assert рд╡рд░реНрдЧ рдкреВрд░реНрдг рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ AssertionException рдлреЗрдВрдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд╣рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдкрджреНрдзрддрд┐ рдореЗрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ, рдЙрдирдХреЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рдВрдЪрдп рдФрд░ рдЕрдВрдд рдореЗрдВ рд╕рдВрдЪрд┐рдд рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдХреЛрдб рдореЗрдВ рд╣реА рдХрд░рдирд╛, рднрдпрд╛рдирдХ рдЖрддрдВрдХ рд╣реИред
рдХреБрдЫ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдмрд╛рдж, рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреИрдЯрд░реА рд╡рд░реНрдЧ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╣реЛрддрд╛ рд╣реИ:
var assertsAccumulator = new AssertsAccumulator(); assertsAccumulator.Accumulate( () => Assert.That(zeroSize.Feet == 0 && zeroSize.RemainderInches == 0, "Zero size")); assertsAccumulator.Accumulate( () => Assert.That(inchesOnlySize.Feet == 0 && inchesOnlySize.RemainderInches == 2, "Inches-only size")); assertsAccumulator.Accumulate( () => Assert.That(mixedSize.Feet == 1 && mixedSize.RemainderInches == 3, "Inches and feet size")); assertsAccumulator.Accumulate( () => Assert.That(feetOnlySize.Feet == 3 && feetOnlySize.RemainderInches == 0, "Feet-only size")); assertsAccumulator.Release();
рдПрдХ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ (рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреЛрдб рдЦреБрдж рдХреЗ рд▓рд┐рдП рдмреЛрд▓рддрд╛ рд╣реИ рдФрд░ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд┐рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ):
Result<User> signInResult = authService.SignIn(TestUsername, TestPassword); var assertsAccumulator = new AssertsAccumulator(); assertsAccumulator.Accumulate(() => Assert.That(signInResult.IsSuccess)); assertsAccumulator.Accumulate(() => Assert.That(signInResult.Value, Is.Not.Null)); assertsAccumulator.Accumulate(() => Assert.That(signInResult.Value.Username, Is.EqualTo(TestUsername))); assertsAccumulator.Accumulate(() => Assert.That(signInResult.Value.Password, Is.EqualTo(HashedTestPassword))); assertsAccumulator.Release();
рджреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рд╕рд╛рде рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреЛрд╕реНрдЯ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рдореЛрд╣рдХ рд╕реНрдХреНрд░реАрди рдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
AssertsAccumulator рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
public class AssertsAccumulator { private StringBuilder Errors { get; set; } private bool AssertsPassed { get; set; } private String AccumulatedErrorMessage { get { return Errors.ToString(); } } public AssertsAccumulator() { Errors = new StringBuilder(); AssertsPassed = true; } private void RegisterError(string exceptionMessage) { AssertsPassed = false; Errors.AppendLine(exceptionMessage); } public void Accumulate(Action assert) { try { assert.Invoke(); } catch (Exception exception) { RegisterError(exception.Message); } } public void Release() { if (!AssertsPassed) { throw new AssertionException(AccumulatedErrorMessage); } } }
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рджреЛ рддрд░реАрдХреЗ рд╕рд╛рдордиреЗ рдЖ рд░рд╣реЗ рд╣реИрдВ, Accumulate () рдФрд░ рд░рд┐рд▓реАрдЬрд╝ (), рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рдкрд╛рд░рджрд░реНрд╢реА рд╣реИред Accumulate рдореЗрдердб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╡рд░реНрдЧ рдХреЛ рдмрд╣реБрдд рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдмрдирд╛рддрд╛ рд╣реИ, рдЖрдк рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрднрд┐рдХрдерди (рдЬреИрд╕рд╛ рдХрд┐ signInResult рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдХреЛ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдХрдХреНрд╖рд╛ рдХреЛ рдХреЗрд╡рд▓ рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рдЕрдВрджрд░ рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рдж рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓рдХрд░ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ рдХреЗ рдЕрдиреБрдХреВрд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд░реНрдЧ рдЖрдкрдХреЛ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдЕрднрд┐рдХреНрд░рд┐рдпрд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВ, рдЬрдмрдХрд┐ рд╡реЗ рд╣рдореЗрд╢рд╛ рдЕрдВрдд рддрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреА рд╣реИрдВ рдФрд░ рдкреВрд░реА рддреНрд░реБрдЯрд┐ рд╕реВрдЪрдирд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрддреА рд╣реИрдВред
рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдХрдЯреНрдЯрд░ рдкрд╛рд▓рди рд╢рд╛рдпрдж рд╣реА рдХрднреА рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рд╣реЛ, рдФрд░ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЕрддреНрдпрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрдм рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдХрдИ рджрд╛рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╢рдмреНрджрд╛рд░реНрдердХ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдСрдкрд░реЗрд╢рди рдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд░рдЦрдирд╛ рдЙрдЪрд┐рдд рд╣реЛрддрд╛ рд╣реИред