feat: improve AI dialogue evaluation and capability boundaries
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:kouyu_english/core/dialogue_decision.dart';
|
||||
import 'package:kouyu_english/core/models.dart';
|
||||
|
||||
DialogueAiIntervention acceptedAi() => const DialogueAiIntervention(
|
||||
accepted: true,
|
||||
goalSatisfied: true,
|
||||
verdict: DialogueAiVerdict.accepted,
|
||||
explanation: '表达自然。',
|
||||
);
|
||||
|
||||
void main() {
|
||||
group('resolveDialogueTurnDecision', () {
|
||||
test('requires local and AI agreement for independent scene evidence', () {
|
||||
final decision = resolveDialogueTurnDecision(
|
||||
local: LocalDialogueVerdict.accepted,
|
||||
ai: acceptedAi(),
|
||||
aiWasAttempted: true,
|
||||
isFreeScene: true,
|
||||
supportLevel: DialogueSupportLevel.none,
|
||||
);
|
||||
|
||||
expect(decision.canAdvance, isTrue);
|
||||
expect(decision.evidenceOutcome, EvidenceKind.independentSuccess);
|
||||
expect(decision.validationSource, DialogueValidationSource.localAndAi);
|
||||
});
|
||||
|
||||
test(
|
||||
'AI semantic acceptance advances an unknown local expression safely',
|
||||
() {
|
||||
final decision = resolveDialogueTurnDecision(
|
||||
local: LocalDialogueVerdict.uncertain,
|
||||
ai: acceptedAi(),
|
||||
aiWasAttempted: true,
|
||||
isFreeScene: true,
|
||||
supportLevel: DialogueSupportLevel.none,
|
||||
);
|
||||
|
||||
expect(decision.canAdvance, isTrue);
|
||||
expect(decision.evidenceOutcome, EvidenceKind.pending);
|
||||
expect(decision.validationSource, DialogueValidationSource.ai);
|
||||
expect(decision.assisted, isFalse);
|
||||
},
|
||||
);
|
||||
|
||||
test('a correction can advance but is always assisted', () {
|
||||
final decision = resolveDialogueTurnDecision(
|
||||
local: LocalDialogueVerdict.accepted,
|
||||
ai: acceptedAi(),
|
||||
aiWasAttempted: true,
|
||||
isFreeScene: true,
|
||||
supportLevel: DialogueSupportLevel.correction,
|
||||
);
|
||||
|
||||
expect(decision.canAdvance, isTrue);
|
||||
expect(decision.evidenceOutcome, EvidenceKind.assisted);
|
||||
expect(decision.assisted, isTrue);
|
||||
});
|
||||
|
||||
test('invalid local input never advances', () {
|
||||
final decision = resolveDialogueTurnDecision(
|
||||
local: LocalDialogueVerdict.rejected,
|
||||
ai: acceptedAi(),
|
||||
aiWasAttempted: true,
|
||||
isFreeScene: true,
|
||||
supportLevel: DialogueSupportLevel.none,
|
||||
);
|
||||
|
||||
expect(decision.canAdvance, isFalse);
|
||||
});
|
||||
|
||||
test('AI outage degrades strict local acceptance to pending evidence', () {
|
||||
final decision = resolveDialogueTurnDecision(
|
||||
local: LocalDialogueVerdict.accepted,
|
||||
ai: null,
|
||||
aiWasAttempted: true,
|
||||
isFreeScene: true,
|
||||
supportLevel: DialogueSupportLevel.none,
|
||||
);
|
||||
|
||||
expect(decision.canAdvance, isTrue);
|
||||
expect(decision.evidenceOutcome, EvidenceKind.pending);
|
||||
expect(decision.validationSource, DialogueValidationSource.unavailable);
|
||||
});
|
||||
|
||||
test('explicit AI correction stops a local false positive', () {
|
||||
const correction = DialogueAiIntervention(
|
||||
accepted: false,
|
||||
goalSatisfied: false,
|
||||
verdict: DialogueAiVerdict.correctable,
|
||||
suggestion: 'My name is Mia.',
|
||||
explanation: '这句话需要修改。',
|
||||
);
|
||||
final decision = resolveDialogueTurnDecision(
|
||||
local: LocalDialogueVerdict.accepted,
|
||||
ai: correction,
|
||||
aiWasAttempted: true,
|
||||
isFreeScene: true,
|
||||
supportLevel: DialogueSupportLevel.none,
|
||||
);
|
||||
|
||||
expect(decision.canAdvance, isFalse);
|
||||
expect(decision.evidenceOutcome, EvidenceKind.pending);
|
||||
expect(decision.validationSource, DialogueValidationSource.disagreement);
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user