Forge
csharpdeeb25a2
1using System.Text.Json;
2using CascadeIDE.Services.Fm;
3using Xunit;
4
5namespace CascadeIDE.Tests;
6
7public sealed class FmOpenAiUsageParserTests
8{
9 [Fact]
10 public void TryParseFromCompletionChunk_reads_usage()
11 {
12 const string json =
13 """
14 {
15 "choices": [],
16 "usage": { "prompt_tokens": 1200, "completion_tokens": 340, "total_tokens": 1540 }
17 }
18 """;
19
20 var usage = FmOpenAiUsageParser.TryParseFromCompletionChunk(json);
21 Assert.NotNull(usage);
22 Assert.Equal(1200, usage.PromptTokens);
23 Assert.Equal(340, usage.CompletionTokens);
24 Assert.Equal(1540, usage.TotalTokens);
25 }
26}
27
28public sealed class FmUsagePresentationTests
29{
30 [Fact]
31 public void FormatSubtitle_includes_turn_session_and_warn()
32 {
33 var last = new FmTurnUsage(100_000, 1200, 101_200);
34 var session = new FmTurnUsage(150_000, 2400, 152_400);
35 var text = FmUsagePresentation.FormatSubtitle(last, session, maxModelLen: 128_000, contextWarnPct: 75);
36 Assert.Contains("ход in 100k", text, StringComparison.Ordinal);
37 Assert.Contains("сессия 152.4k", text, StringComparison.Ordinal);
38 Assert.Contains("⚠ budget", text, StringComparison.Ordinal);
39 }
40}
41
42public sealed class FmModelCatalogTests
43{
44 [Fact]
45 public void ParseModelList_reads_max_model_len_and_costs()
46 {
47 using var doc = JsonDocument.Parse(
48 """
49 {
50 "data": [
51 {
52 "id": "openai/gpt-oss-120b",
53 "max_model_len": 128000,
54 "metadata": {
55 "prompt_tokens_cost": 0.1,
56 "generated_tokens_cost": 0.2
57 }
58 }
59 ]
60 }
61 """);
62
63 var models = FmModelCatalog.ParseModelList(doc.RootElement);
64 Assert.Single(models);
65 Assert.Equal("openai/gpt-oss-120b", models[0].ModelId);
66 Assert.Equal(128_000, models[0].MaxModelLen);
67 Assert.Equal(0.1, models[0].PromptTokensCost);
68 Assert.Equal(0.2, models[0].GeneratedTokensCost);
69 }
70}
71
View only · write via MCP/CIDE