diff --git a/.gitignore b/.gitignore index 2a5312192232fb7be3719d9c2969e47cb63a7b82..834539af03b5e146db8e2388511ffc5bb6bdce04 100644 --- a/.gitignore +++ b/.gitignore @@ -116,3 +116,4 @@ tags # End of https://www.gitignore.io/api/c,vim,c++,linux,cmake mysh +mysh-test diff --git a/include/commands.h b/include/commands.h index 7fbe4d9777458b930b91719f6bceeaff6156fa80..c0b66fecb66fd5863c4e9b9ab363c3a053eb37bc 100644 --- a/include/commands.h +++ b/include/commands.h @@ -7,8 +7,8 @@ struct single_command char** argv; }; -int evaluate_command(int n_commands, struct single_command (*commands)[]); +int evaluate_command(int n_commands, struct single_command (*commands)[512]); -void free_commands(int n_commands, struct single_command (*commands)[]); +void free_commands(int n_commands, struct single_command (*commands)[512]); #endif // MYSH_COMMANDS_H_ diff --git a/include/utils.h b/include/utils.h index 5f3403dd0226dca7e5f1b06d6b0193e2b1caf43d..54fa69fc192371bbfdc7579a4af7d457f7592fd8 100644 --- a/include/utils.h +++ b/include/utils.h @@ -5,7 +5,7 @@ void mysh_parse_command(const char* command, int* n_commands, - struct single_command (*commands)[]); + struct single_command (*commands)[512]); void parse_single_command(const char* command, int *argc, char*** argv); diff --git a/src/commands.c b/src/commands.c index 2a4e6eccf7c1efd74825114ee6b2f08894d0fc96..13e9c330aedcb9d3c1c0979a5b22fd7844516ada 100644 --- a/src/commands.c +++ b/src/commands.c @@ -28,7 +28,7 @@ static int is_built_in_command(const char* command_name) /* * Description: Currently this function only handles single built_in commands. You should modify this structure to launch process and offer pipeline functionality. */ -int evaluate_command(int n_commands, struct single_command (*commands)[]) +int evaluate_command(int n_commands, struct single_command (*commands)[512]) { if (n_commands > 0) { struct single_command* com = (*commands); @@ -58,7 +58,7 @@ int evaluate_command(int n_commands, struct single_command (*commands)[]) return 0; } -void free_commands(int n_commands, struct single_command (*commands)[]) +void free_commands(int n_commands, struct single_command (*commands)[512]) { for (int i = 0; i < n_commands; ++i) { struct single_command *com = (*commands) + i; diff --git a/tests/src/command_parsing_test.cc b/tests/src/command_parsing_test.cc index 6f943a1174cb34cb5c9d178ce0cd808123e2e857..3ba041d7731ea54b7c8416af2d946673b898ff95 100644 --- a/tests/src/command_parsing_test.cc +++ b/tests/src/command_parsing_test.cc @@ -1,102 +1,102 @@ +#ifdef __cplusplus extern "C" { +#endif #include "utils.h" +#include "commands.h" +#ifdef __cplusplus } +#endif #include "gtest/gtest.h" #include <stdlib.h> -static void free_string_array(char*** argv, int num_str); - TEST(CommandParsingTest, BasicCommand) { - char** argv = NULL; - int argc = -1; + struct single_command commands[512]; + int n_commands = 0; - mysh_parse_command("cd test", &argc, &argv); + mysh_parse_command("cd test", &n_commands, &commands); - ASSERT_EQ(argc, 2); - EXPECT_STREQ(argv[0], "cd"); - EXPECT_STREQ(argv[1], "test"); + ASSERT_EQ(n_commands, 1); + ASSERT_EQ(commands[0].argc, 2); + EXPECT_STREQ(commands[0].argv[0], "cd"); + EXPECT_STREQ(commands[0].argv[1], "test"); - free_string_array(&argv, argc); + free_commands(n_commands, &commands); } TEST(CommandParsingTest, SingleCommand) { - char** argv = NULL; - int argc = -1; + struct single_command commands[512]; + int n_commands = 0; - mysh_parse_command("pwd", &argc, &argv); + mysh_parse_command("pwd", &n_commands, &commands); - ASSERT_EQ(argc, 1); - EXPECT_STREQ(argv[0], "pwd"); + ASSERT_EQ(n_commands, 1); + ASSERT_EQ(commands[0].argc, 1); + EXPECT_STREQ(commands[0].argv[0], "pwd"); - free_string_array(&argv, argc); + free_commands(n_commands, &commands); } TEST(CommandParsingTest, Redirection1) { - char** argv = NULL; - int argc = -1; + struct single_command commands[512]; + int n_commands = 0; - mysh_parse_command("pwd > curdir.txt", &argc, &argv); + mysh_parse_command("pwd > curdir.txt", &n_commands, &commands); - ASSERT_EQ(argc, 3); - EXPECT_STREQ(argv[0], "pwd"); - EXPECT_STREQ(argv[1], ">"); - EXPECT_STREQ(argv[2], "curdir.txt"); + ASSERT_EQ(n_commands, 1); + ASSERT_EQ(commands[0].argc, 3); + EXPECT_STREQ(commands[0].argv[0], "pwd"); + EXPECT_STREQ(commands[0].argv[1], ">"); + EXPECT_STREQ(commands[0].argv[2], "curdir.txt"); - free_string_array(&argv, argc); + free_commands(n_commands, &commands); } TEST(CommandParsingTest, Redirection2) { - char** argv = NULL; - int argc = -1; + struct single_command commands[512]; + int n_commands = 0; + + mysh_parse_command("pwd > curdir.txt | less", &n_commands, &commands); - mysh_parse_command("pwd > curdir.txt | less", &argc, &argv); + ASSERT_EQ(n_commands, 2); + ASSERT_EQ(commands[0].argc, 3); + EXPECT_STREQ(commands[0].argv[0], "pwd"); + EXPECT_STREQ(commands[0].argv[1], ">"); + EXPECT_STREQ(commands[0].argv[2], "curdir.txt"); - ASSERT_EQ(argc, 5); - EXPECT_STREQ(argv[0], "pwd"); - EXPECT_STREQ(argv[1], ">"); - EXPECT_STREQ(argv[2], "curdir.txt"); - EXPECT_STREQ(argv[3], "|"); - EXPECT_STREQ(argv[4], "less"); + ASSERT_EQ(commands[1].argc, 1); + EXPECT_STREQ(commands[1].argv[0], "less"); - free_string_array(&argv, argc); + free_commands(n_commands, &commands); } TEST(CommandParsingTest, SpaceBeforeString) { - char** argv = NULL; - int argc = -1; + struct single_command commands[512]; + int n_commands = 0; - mysh_parse_command(" \n \t pwd > curdir.txt | less", &argc, &argv); + mysh_parse_command(" \n \t pwd > curdir.txt | less", &n_commands, &commands); - ASSERT_EQ(argc, 5); - EXPECT_STREQ(argv[0], "pwd"); - EXPECT_STREQ(argv[1], ">"); - EXPECT_STREQ(argv[2], "curdir.txt"); - EXPECT_STREQ(argv[3], "|"); - EXPECT_STREQ(argv[4], "less"); + ASSERT_EQ(n_commands, 2); + ASSERT_EQ(commands[0].argc, 3); + EXPECT_STREQ(commands[0].argv[0], "pwd"); + EXPECT_STREQ(commands[0].argv[1], ">"); + EXPECT_STREQ(commands[0].argv[2], "curdir.txt"); - free_string_array(&argv, argc); + ASSERT_EQ(commands[1].argc, 1); + EXPECT_STREQ(commands[1].argv[0], "less"); + + free_commands(n_commands, &commands); } TEST(CommandParsingTest, EmptyCommand) { - char** argv = NULL; - int argc = -1; - - mysh_parse_command(" \n \t ", &argc, &argv); - - ASSERT_EQ(argc, 1); - EXPECT_STREQ(argv[0], ""); - - free_string_array(&argv, argc); -} + struct single_command commands[512]; + int n_commands = 0; -static void free_string_array(char*** argv, int num_str) { - for (int i = 0; i < num_str; ++i) { - free((*argv)[i]); - } + mysh_parse_command(" \n \t ", &n_commands, &commands); - free(*argv); + ASSERT_EQ(commands[0].argc, 1); + EXPECT_STREQ(commands[0].argv[0], ""); - *argv = NULL; + free_commands(n_commands, &commands); } diff --git a/tests/src/command_validate_test.cc b/tests/src/command_validate_test.cc index 527485478e31acc7cb80a3595af4d3a8f24acd3e..4da9bac54851bce6504d56658f6b1e0c00a9b713 100644 --- a/tests/src/command_validate_test.cc +++ b/tests/src/command_validate_test.cc @@ -1,5 +1,5 @@ extern "C" { -#include "commands.h" +#include "built_in.h" } #include "gtest/gtest.h"