// Copyright (c) 2025, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// This test was generated by Gemini.

import "dart:io";

import "package:expect/expect.dart";

// The simple script to be run in a child process.
// It prints both executable paths to standard output.
const String _testScriptContent = """
import "dart:io";

void main() {
  print(Platform.executable);
  print(Platform.resolvedExecutable);
}
""";

void main() {
  if (!Platform.isLinux && !Platform.isMacOS) return;

  // 1. Get the absolute path to the current Dart executable.
  final dartExecutablePath = Platform.resolvedExecutable;

  // 2. Create a temporary directory and the necessary files.
  final tempDir = Directory.systemTemp.createTempSync("dart_symlink_test_");
  final symlinkPath = "${tempDir.path}${Platform.pathSeparator}dart_symlink";
  final childScriptPath =
      "${tempDir.path}${Platform.pathSeparator}child_script.dart";

  try {
    // Create the symbolic link.
    Link(symlinkPath).createSync(dartExecutablePath, recursive: true);

    // Write the child script to a file.
    File(childScriptPath).writeAsStringSync(_testScriptContent);

    // 3. Execute the child script using the symlink.
    final result = Process.runSync(
      symlinkPath, // This is the key: use the symlink path
      [childScriptPath],
      runInShell: true,
    );

    // Verify the child process exited successfully.
    print("stdout:");
    print(result.stdout);
    print("stderr:");
    print(result.stderr);

    Expect.equals(0, result.exitCode);

    // 4. Parse the output.
    final output = result.stdout.toString().trim().split("\n");
    final executablePath = output[0];
    final resolvedExecutablePath = output[1];

    // 5. Assert the paths are different.
    print("Executable: $executablePath");
    print("Resolved Executable: $resolvedExecutablePath");
    Expect.notEquals(executablePath, resolvedExecutablePath);
  } finally {
    // Clean up the temporary directory.
    if (tempDir.existsSync()) {
      tempDir.deleteSync(recursive: true);
    }
  }
}
