Files
SVSimServer/SVSim.UnitTests/Importers/ArenaTwoPickRewardImporterTests.cs
gamer147 6381e4da51 fix(tk2): match original SV (5-battle cap, no loss limit)
User clarified: the 0..7 win reward tiers came from Shadowverse Worlds
Beyond (sequel), not the original game we're emulating. Original SV's
Take Two caps at 5 total battles played and has no loss limit (verified
on prod: queueing continues with 2+ losses).

- arena-two-pick-rewards.json: drop 6w + 7w tiers (12 rows remain).
- ArenaTwoPickConfig: remove MaxLosses property.
- ArenaTwoPickService: termination is now battlesPlayed >= maxBattles
  (5 from MAX(reward.WinCount)). RecordBattleResult no longer flips
  IsSelectCompleted on the 2nd loss.
- ResolveMaxBattleCountAsync empty-catalog default 7 → 5.
- Tests updated for the new counts (16 → 12 rows, max 7 → 5).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-31 12:47:43 -04:00

64 lines
2.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using SVSim.Bootstrap.Importers;
using SVSim.Database;
using SVSim.UnitTests.Infrastructure;
namespace SVSim.UnitTests.Importers;
public class ArenaTwoPickRewardImporterTests
{
private static async Task<SVSimDbContext> CreateContextAsync()
{
var factory = new SVSimTestFactory();
var scope = factory.Services.CreateScope();
var db = scope.ServiceProvider.GetRequiredService<SVSimDbContext>();
await db.Database.EnsureCreatedAsync();
return db;
}
[Test]
public async Task Import_loads_all_12_rows_from_seed_file()
{
await using var db = await CreateContextAsync();
var importer = new ArenaTwoPickRewardImporter();
await importer.ImportAsync(db, FindSeedDir());
// 6 WinCount tiers (0..5) × 2 reward rows each = 12. Classic SV TK2 caps at 5 battles.
var rows = await db.ArenaTwoPickRewards.OrderBy(r => r.WinCount).ThenBy(r => r.RewardType).ToListAsync();
Assert.That(rows.Count, Is.EqualTo(12));
Assert.That(rows.Max(r => r.WinCount), Is.EqualTo(5));
var w0 = rows.Where(r => r.WinCount == 0).ToList();
Assert.That(w0.Count, Is.EqualTo(2));
Assert.That(w0.Single(r => r.RewardType == 4).RewardNum, Is.EqualTo(1));
Assert.That(w0.Single(r => r.RewardType == 9).RewardNum, Is.EqualTo(100));
var w5 = rows.Where(r => r.WinCount == 5).ToList();
Assert.That(w5.Single(r => r.RewardType == 4).RewardNum, Is.EqualTo(1));
Assert.That(w5.Single(r => r.RewardType == 9).RewardNum, Is.EqualTo(1000));
}
[Test]
public async Task Import_is_idempotent_on_re_run()
{
await using var db = await CreateContextAsync();
var importer = new ArenaTwoPickRewardImporter();
await importer.ImportAsync(db, FindSeedDir());
await importer.ImportAsync(db, FindSeedDir());
var count = await db.ArenaTwoPickRewards.CountAsync();
Assert.That(count, Is.EqualTo(12), "second import should upsert, not duplicate");
}
private static string FindSeedDir()
{
var dir = Path.Combine(AppContext.BaseDirectory, "Data", "seeds");
if (!Directory.Exists(dir))
throw new DirectoryNotFoundException($"seeds dir not found at {dir} — verify csproj copy");
return dir;
}
}