import 'dart:io' as io;

import 'package:litetest/litetest.dart';
import 'package:path/path.dart' as p;

void main() {
  // Find a path to `dir_contents_diff.dart` from the working directory.
  final String pkgPath = io.File.fromUri(io.Platform.script).parent.parent.path;
  final String binPath = p.join(
    pkgPath,
    'bin',
    'dir_contents_diff.dart',
  );

  // As a sanity check, ensure that the file exists.
  if (!io.File(binPath).existsSync()) {
    io.stderr.writeln('Unable to find $binPath');
    io.exitCode = 1;
    return;
  }


  // Runs `../bin/dir_contents_diff.dart` with the given arguments.
  (int, String) runSync(String goldenPath, String dirPath) {
    final io.ProcessResult result = io.Process.runSync(
      'dart',
      <String>[binPath, goldenPath, dirPath],
    );
    return (result.exitCode, result.stdout ?? result.stderr);
  }

  test('lists files and diffs successfully', () {
    final String goldenPath = p.join(pkgPath, 'test', 'file_ok.txt');
    final String dirPath = p.join(pkgPath, 'test', 'fixtures');
    final (int exitCode, String output) = runSync(goldenPath, dirPath);
    if (exitCode != 0) {
      io.stderr.writeln('Expected exit code 0, got $exitCode');
      io.stderr.writeln(output);
    }
    expect(exitCode, 0);
  });

  test('lists files and diffs successfully, even with an EOF newline', () {
    final String goldenPath = p.join(pkgPath, 'test', 'file_ok_eof_newline.txt');
    final String dirPath = p.join(pkgPath, 'test', 'fixtures');
    final (int exitCode, String output) = runSync(goldenPath, dirPath);
    if (exitCode != 0) {
      io.stderr.writeln('Expected exit code 0, got $exitCode');
      io.stderr.writeln(output);
    }
    expect(exitCode, 0);
  });

  test('diff fails when an expected file is missing', () {
    final String goldenPath = p.join(pkgPath, 'test', 'file_bad_missing.txt');
    final String dirPath = p.join(pkgPath, 'test', 'fixtures');
    final (int exitCode, String output) = runSync(goldenPath, dirPath);
    if (exitCode == 0) {
      io.stderr.writeln('Expected non-zero exit code, got $exitCode');
      io.stderr.writeln(output);
    }
    expect(exitCode, 1);
    expect(output, contains('+a.txt'));
  });

  test('diff fails when an unexpected file is present', () {
    final String goldenPath = p.join(pkgPath, 'test', 'file_bad_unexpected.txt');
    final String dirPath = p.join(pkgPath, 'test', 'fixtures');
    final (int exitCode, String output) = runSync(goldenPath, dirPath);
    if (exitCode == 0) {
      io.stderr.writeln('Expected non-zero exit code, got $exitCode');
      io.stderr.writeln(output);
    }
    expect(exitCode, 1);
    expect(output, contains('-c.txt'));
  });
}
