I’m stuck on Stage #IP1
I’ve tried running on my local, “type cat” command works fine, but I cannot get it right in the test environment.
Here are my logs:
[tester::#MG5] Running tests for Stage #MG5 (The type builtin: executable files)
[tester::#MG5] [setup] export PATH=/tmp/quz:$PATH
[tester::#MG5] [setup] export PATH=/tmp/baz:$PATH
[tester::#MG5] [setup] PATH is now: /tmp/baz:/tmp/quz:/usr/local/sbin:...
[tester::#MG5] [setup] Available executables:
[tester::#MG5] [setup] - my_exe
[tester::#MG5] Running ./your_program.sh
[your-program] $ type cat
[your-program] cat: command not found
[tester::#MG5] ^ Line does not match expected value.
[tester::#MG5] Expected: "cat is /bin/cat"
[tester::#MG5] Received: "cat: command not found"
[your-program] $
[tester::#MG5] Assertion failed.
[tester::#MG5] Test failed
And here’s a snippet of my code:
using System.Diagnostics;
namespace codecrafters_shell.CommandInterpreter;
public class CommandInterpreter : ICommandInterpreter
{
private const string EchoCommand = "echo";
private const string TypeCommand = "type";
private const string ExitCommand = "exit";
private const string PathEnvironmentVariable = "PATH";
private static readonly HashSet<string> ValidCommands =
[
EchoCommand,
TypeCommand,
ExitCommand
];
// The boolean return type is for indicating whether the shell should continue running.
public bool InterpretCommand(string commandString)
{
var command = new Queue<string>(commandString.Split(' '));
if (TryRunProgram(command)) return true;
var action = command.Dequeue();
if (action == ExitCommand)
//Ignore if it is exit 0 or not for now
return false; // Indicates that the shell should stop running.
if (action == EchoCommand)
{
ExecuteEchoCommand(command);
return true;
}
if (action == TypeCommand)
{
ExecuteTypeCommand(command);
return true;
}
Console.WriteLine($"{action}: command not found");
return true;
}
private void ExecuteTypeCommand(Queue<string> command)
{
if (command.Count == 0)
{
Console.WriteLine("No command provided for type command.");
return;
}
var action = command.Dequeue();
if (ValidCommands.Contains(action))
{
Console.WriteLine($"{action} is a shell builtin");
return;
}
var paths = GetEnvironmentPaths(action);
foreach (var path in paths)
{
if (File.Exists(path))
{
Console.WriteLine($"{action} is {path}");
return;
}
}
Console.WriteLine($"{action}: not found");
}
...
* List item
private List<string> GetEnvironmentPaths(string fileName)
{
var pathEnvironmentVariable = Environment.GetEnvironmentVariable(PathEnvironmentVariable);
var paths = pathEnvironmentVariable?.Split(':').ToList() ?? [];
return paths.Distinct().Select(path => Path.Combine(path, fileName)).ToList();
}
}
I have uploaded the whole project to github in case you want to run it: GitHub - leonCTL12/CodeCrafterShell