Files
alexei.dolgolyov 61114ea31b feat: implement Phase 1 — solution skeleton and domain model
Creates the 9-project .NET 8 solution (5 src + 4 test) with Marathon.Domain
fully implemented: value objects (SportCode, EventId, OddsRate, OddsValue,
BetScope hierarchy), enums (Side, BetType, OddsSource, AnomalyKind), and
entities (Sport, Country, League, Event, Bet, OddsSnapshot, EventResult,
Anomaly) with all invariants enforced in constructors. 96 domain tests pass
(FluentAssertions + xUnit). Directory.Build.props and Directory.Packages.props
centralise build settings and NuGet versions. Both Marathon.sln and Marathon.slnx
are committed; dotnet build Marathon.sln succeeds with 0 warnings/errors.
2026-05-05 01:20:28 +03:00

41 lines
1.0 KiB
C#

using FluentAssertions;
using Marathon.Domain.ValueObjects;
namespace Marathon.Domain.Tests.ValueObjects;
public sealed class OddsRateTests
{
[Theory]
[InlineData("1.01")]
[InlineData("1.65")]
[InlineData("10.5")]
[InlineData("100.0")]
public void Constructor_CreatesInstance_WhenValueIsGreaterThanOne(string rawValue)
{
var value = decimal.Parse(rawValue);
var rate = new OddsRate(value);
rate.Value.Should().Be(value);
}
[Theory]
[InlineData("1.0")]
[InlineData("0.99")]
[InlineData("0.0")]
[InlineData("-1.5")]
public void Constructor_ThrowsArgumentOutOfRangeException_WhenValueIsOneOrLess(string rawValue)
{
var value = decimal.Parse(rawValue);
var act = () => new OddsRate(value);
act.Should().Throw<ArgumentOutOfRangeException>()
.WithParameterName("value");
}
[Fact]
public void Equality_IsValueBased()
{
var a = new OddsRate(1.65m);
var b = new OddsRate(1.65m);
a.Should().Be(b);
}
}