import 'package:test/test.dart';
import 'package:hegeltest/hegeltest.dart';
void main() {
hegelTest('payment handles currency matrix & zero amounts', (tc) {
// Weighted domain generator
final currency = tc.draw(sampledWeighted([(80, 'USD'), (15, 'EUR'), (5, 'JPY')]));
final amount = tc.draw(integers(min: 0, max: 500000), label: 'amount');
// Classify distributions conditionally
tc.classify(amount == 0, 'zero_amount');
tc.classify(amount > 250000, 'large_amount');
// Coverage Contract: assert zero-amount edge cases tested >= 10%
tc.cover(10.0, amount == 0, 'zero_amount_coverage');
final invoice = createInvoice(amount: amount, currency: currency);
expect(invoice.total, equals(amount));
});
}
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:hegeltest_flutter/hegeltest_flutter.dart';
void main() {
// Traverses SemanticsOwner tree & fuzzes actions (taps, inputs, scrolls)
hegelFlutterMonkeyTest(
'fuzzes checkout workflow without unhandled exceptions',
createWidget: (tc) => const CheckoutApp(),
steps: 25,
allowedActions: [
SemanticsAction.tap,
SemanticsAction.setText,
SemanticsAction.scrollDown,
],
invariant: (tc, tester) async {
// Invariant checked after every fuzzed action sequence
expect(find.byType(CheckoutApp), findsOneWidget);
},
);
// On crash, Hegel's engine automatically shrinks down to minimal steps:
// 1. tap on "Add Coupon" (id=14)
// 2. setText on "Coupon Code" (id=18) with "DISCOUNT99"
// 3. tap on "Apply" (id=19) => throws RangeError
}
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:hegeltest_flutter/hegeltest_flutter.dart';
void main() {
// Sweeps screen sizes, TextScaler (font sizes), & RTL/LTR directions
hegelFlutterLayoutSweepTest(
'user profile card never overflows across screens and text scales',
sweepConfig: const LayoutSweepConfig(
minWidth: 320,
maxWidth: 1024,
minHeight: 480,
maxHeight: 1200,
minTextScale: 0.8,
maxTextScale: 2.5,
),
builder: (tc, sample) => const UserProfileCard(),
);
// Catches "A RenderFlex overflowed by X pixels" & shrinks viewport/scale:
// Layout invariant violated:
// Configuration: LayoutSample(320.0x480.0, textScale: 2.10x, direction: rtl)
// Error: A RenderFlex overflowed by 14 pixels on the right.
}
import 'package:flutter_test/flutter_test.dart';
import 'package:hegeltest_flutter/hegeltest_flutter.dart';
class BoundedQueueMachine extends StateMachine {
final queue = <int>[];
@override
List<StateRule> get rules => [
StateRule('enqueue', execute: (tc) {
final item = tc.draw(integers());
queue.add(item);
}),
StateRule('dequeue', precondition: () => queue.isNotEmpty, execute: (tc) {
queue.removeAt(0);
}),
];
@override
List<StateInvariant> get invariants => [
StateInvariant('queue size is non-negative', check: (tc) {
expect(queue.length, greaterThanOrEqualTo(0));
}),
];
}
void main() {
hegelFlutterStatefulTest('queue satisfies invariants', () => BoundedQueueMachine());
}
# Instant regression replay across GitHub Actions CI
name: Test Suite
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Cache Hegel Counterexamples
uses: actions/cache@v4
with:
path: .hegel/
key: hegel-${{ runner.os }}-${{ github.ref_name }}
restore-keys: hegel-${{ runner.os }}-
- run: flutter test # Replays failing counterexamples on iteration 1!