Сгруппировать тестовые проекты по областям

Deal.Tests.Unit, Deal.Telegram.Tests, Deal.Ai.Tests, Deal.Ml.Tests
разложены по областям (Modules/<X>, Api, Infrastructure, Contracts,
Grpc, ...), общие хелперы -> Support; namespace = папка, using
между областями добавлены итеративно по ошибкам сборки.
This commit is contained in:
Rustam Khalimov
2026-09-11 13:28:26 +03:00
parent e3a2692507
commit 5bfa92a4ac
212 changed files with 1982 additions and 1686 deletions
@@ -0,0 +1,67 @@
using Deal.Ai.Llm;
using Deal.Ai.Tests.Support;
namespace Deal.Ai.Tests.Ai;
/// <summary>
/// Unit-тесты оценки токенов (план Task 7; TokenEstimator, Ruling 5): usage API-ответа провайдера
/// проходит как есть (total «берём как есть»), при отсутствии — оценка по символам ≈ceil(chars/4).
/// Без сети.
/// </summary>
public sealed class TokenEstimatorTests
{
/// <summary>
/// Usage провайдера проходит без изменений, включая total ≠ сумме (как отдал API).
/// </summary>
[Fact]
public void Resolve_WithProviderUsage_PassesThrough()
{
var provider = new ProviderUsage(PromptTokens: 11, CompletionTokens: 5, TotalTokens: 16);
LlmUsage usage = TokenEstimator.Resolve(provider, "system", "text");
Assert.Equal(11, usage.PromptTokens);
Assert.Equal(5, usage.CompletionTokens);
Assert.Equal(16, usage.TotalTokens);
}
/// <summary>
/// Нет usage провайдера — оценка по символам: prompt из system+user, completion из текста.
/// </summary>
[Fact]
public void Resolve_WithoutProviderUsage_EstimatesByChars()
{
// prompt-текст = 8 символов → 2 токена; completion-текст = 13 символов → ceil(13/4) = 4.
LlmUsage usage = TokenEstimator.Resolve(null, "12345678", """{"pass": true}""");
Assert.Equal(2, usage.PromptTokens);
Assert.Equal(4, usage.CompletionTokens);
Assert.Equal(6, usage.TotalTokens);
}
/// <summary>
/// Округление вверх: ровно 4 символа — 1 токен, 5 символов — 2 токена.
/// </summary>
[Fact]
public void Resolve_WithoutProviderUsage_RoundsUp()
{
LlmUsage fourChars = TokenEstimator.Resolve(null, "abcd", string.Empty);
LlmUsage fiveChars = TokenEstimator.Resolve(null, "abcde", string.Empty);
Assert.Equal(1, fourChars.PromptTokens);
Assert.Equal(2, fiveChars.PromptTokens);
}
/// <summary>
/// Пустые тексты дают нулевую оценку (не отрицательную).
/// </summary>
[Fact]
public void Resolve_EmptyTexts_ReturnsZeroTokens()
{
LlmUsage usage = TokenEstimator.Resolve(null, string.Empty, string.Empty);
Assert.Equal(0, usage.PromptTokens);
Assert.Equal(0, usage.CompletionTokens);
Assert.Equal(0, usage.TotalTokens);
}
}