#!/bin/sh
# Smoke test for the installed leak_tracker_testing library; runs offline.
set -eu

work=$(mktemp -d)
export HOME="$work"
trap 'rm -rf "$work"' EXIT INT TERM

DART=$(command -v dart 2>/dev/null || true)
[ -n "$DART" ] || DART=/usr/lib/dart/bin/dart

# Each package gets the language version its own pubspec asks for.
json=""
add_pkg() {
	dir="/usr/share/dart/packages/$1"
	lv=$(LC_ALL=C grep -E "^  sdk:" "$dir/pubspec.yaml" 2>/dev/null | LC_ALL=C grep -oE "[0-9]+\.[0-9]+" | head -1)
	[ -n "$lv" ] || lv=3.0
	[ -z "$json" ] || json="$json,"
	json="$json{\"name\":\"$1\",\"rootUri\":\"file://$dir\",\"packageUri\":\"lib/\",\"languageVersion\":\"$lv\"}"
}


# Reference every installed Dart package so transitive imports resolve.
for dir in /usr/share/dart/packages/*/; do
	[ -d "$dir" ] || continue
	add_pkg "$(basename "$dir")"
done

mkdir -p "$work/.dart_tool"
cat > "$work/.dart_tool/package_config.json" <<JSON
{"configVersion":2,"packages":[$json]}
JSON

cat > "$work/main.dart" <<'DART'
import 'package:leak_tracker/leak_tracker.dart';
import 'package:leak_tracker_testing/leak_tracker_testing.dart';
import 'package:matcher/matcher.dart';

void main() {
  final defaults = LeakTesting.settings;
  if (defaults.ignore) {
    throw StateError('default LeakTesting.settings must not ignore leaks');
  }
  if (!defaults.withIgnoredAll().ignore) {
    throw StateError('withIgnoredAll() did not set ignore');
  }
  if (defaults.withTrackedAll().ignore) {
    throw StateError('withTrackedAll() did not clear ignore');
  }

  final traced = defaults.withCreationStackTrace().withDisposalStackTrace();
  if (!traced.leakDiagnosticConfig.collectStackTraceOnStart ||
      !traced.leakDiagnosticConfig.collectStackTraceOnDisposal) {
    throw StateError('stack trace flags were not applied');
  }
  if (defaults.leakDiagnosticConfig.collectStackTraceOnStart) {
    throw StateError('settings are not copied before modification');
  }

  final ignored = defaults.withIgnored(allNotDisposed: true);
  if (!ignored.ignoredLeaks.isIgnored('Probe', leakType: LeakType.notDisposed)) {
    throw StateError('withIgnored(allNotDisposed: true) did not apply');
  }
  if (ignored.ignoredLeaks.isIgnored('Probe', leakType: LeakType.notDisposed) &&
      defaults.ignoredLeaks.isIgnored('Probe', leakType: LeakType.notDisposed)) {
    throw StateError('notDisposed is ignored by default, test is meaningless');
  }

  if (isLeakFree is! Matcher) {
    throw StateError('isLeakFree is not a Matcher');
  }

  print('leak_tracker_testing smoke test passed');
}
DART

cd "$work"
"$DART" run main.dart
