Expansion: temporarily sharing broken version

This commit is contained in:
Jérôme Guélen 2025-03-19 17:20:03 +01:00
parent 0f8b18b32f
commit ea3ecaaf31
No known key found for this signature in database
7 changed files with 163 additions and 72 deletions

View file

@ -6,7 +6,7 @@
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/03/06 13:01/15 by khais #+# #+# */
/* Updated: 2025/03/06 18:07:20 by jguelen ### ########.fr */
/* Updated: 2025/03/19 17:16:02 by jguelen ### ########.fr */
/* */
/* ************************************************************************** */
@ -17,6 +17,7 @@
#include "../src/subst/subst.h"
#include "../src/env/env.h"
#include "../src/env/env_manip.h"
#include "../src/parser/wordsplit/wordsplit.h"
static t_worddesc *create_single_word(char *str)
@ -53,72 +54,154 @@ static void test_insert_instr(void)
free(line);
}
//Test to be remade since structures changed in the function calls and returns.
static void test_env_variable_expansion(void)
/*
** NOTE/REMINDER: I currently replace $0 to $9 with nothing but I can change
** this behavior at any point if you would rather we ignored them and therefore
** did not replace those.
*/
void test_env_variable_expansion(void)
{
t_worddesc *token;
t_worddesc *tk;
t_env *env;
struct s_minishell app;
t_wordlist *list;
t_minishell *app;
char *value;
char *key;
app.last_return_value = 0;
token = worddesc_create(ft_strdup("$USER"), W_HASDOLLAR);
if (!token)
assert("ft_strdup failed" && false);
env = NULL;
app.env = env;
env = env_set_entry(&env, "USER", "jguelen");
if (env == NULL)
assert("malloc failed" && false);
env = env_set_entry(&env, "_canard", "coing coing");
if (!env)
assert("malloc failed: slipped on a duck" && false);
tk = word_var_expansion(token, &app);
if (!tk)
assert("internal word_var_expansion failure" && false);
assert_strequal("jguelen", tk->word);
free(token);
token = worddesc_create(ft_strdup("\"$_caneton\""), W_HASDOLLAR);
if (!token)
assert("ft_strdup failed" && false);
tk = word_var_expansion(token, &app);
if (!tk)
assert("internal word_var_expansion failure" && false);
assert_strequal("\"\"", tk->word);
free(token);
token = worddesc_create(ft_strdup("$_canard$USER$''$USER\"\"\"$_canard\"$"), W_HASDOLLAR);
if (!token)
assert("ft_strdup failed" && false);
tk = word_var_expansion(token, &app);
if (!tk)
assert("internal word_var_expansion failure" && false);
assert_strequal("coing coingjguelen''jguelencoing coing$", tk->word);
free(token);
token = worddesc_create(ft_strdup("$_can'a'rd"), W_HASDOLLAR);
if (!token)
assert("ft_strdup failed" && false);
tk = word_var_expansion(token, &app);
if (!tk)
assert("internal word_var_expansion failure" && false);
assert_strequal("'a'rd", tk->word);
free(token);
env_destroy(env);
value = ft_strdup("/home/jguelen/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin");
key = ft_strdup("PATH");
app = ft_calloc(1, sizeof(t_minishell));
app->env = env_set_entry(&(app->env), key, value);
key = ft_strdup("USER");
value = ft_strdup("jguelen");
app->env = env_set_entry(&(app->env), key, value);
list = minishell_wordsplit("$USER$USER $PATH \"'$USER'$USER\" a$test'b' '$USER'");
list = wordlist_var_expansion(list, app);
assert_strequal("jguelenjguelen", list->word->word);
assert_strequal("/home/jguelen/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin", list->next->word->word);
assert_strequal("\"'jguelen'jguelen\"", list->next->next->word->word);
assert_strequal("a'b'", list->next->next->next->word->word);
assert_strequal("'$USER'", list->next->next->next->next->word->word);
wordlist_destroy(list);
env_destroy(app->env);
free(app);
}
static void test_filename_path_expansion(void)
static void test_cmd_path_expansion(void)
{
t_minishell *app;
char *key;
char *value;
char *cmdpath;
key = ft_strdup("PATH");
value = ft_strdup("/usr/bin");
app = ft_calloc(1, sizeof(t_minishell));
app->env = env_set_entry(&(app->env), key, value);
cmdpath = get_cmdpath("ls", app);
assert_strequal("/usr/bin/ls", cmdpath);
free(cmdpath);
value = ft_strdup(":/usr/bin");
app->env = env_set_entry(&(app->env), key, value);
cmdpath = get_cmdpath("ls", app);
assert_strequal("./ls", cmdpath);
free(cmdpath);
cmdpath = get_cmdpath("peekaboo", app);
assert(cmdpath == NULL);
free(cmdpath);
env_destroy(app->env);
free(app);
}
static void test_filename_star_expansion(void)
{
t_worddesc *filepattern;
t_wordlist *expanded;
t_wordlist *tmp;
//test1
filepattern = create_single_word("*");
expanded = expand_star(filepattern);
tmp = expanded;
assert_strequal("blabla", tmp->word->word);
tmp = tmp->next;
assert(tmp);
assert_strequal("exp", tmp->word->word);
tmp = tmp->next;
assert(tmp);
assert_strequal("expansion.c", tmp->word->word);
tmp = tmp->next;
assert(tmp);
assert_strequal("flagadaPATH", tmp->word->word);
tmp = tmp->next;
assert(tmp);
assert_strequal("ls", tmp->word->word);
tmp = tmp->next;
assert(tmp);
assert_strequal("Makefile", tmp->word->word);
tmp = tmp->next;
assert(tmp);
assert_strequal("metacharacters.c", tmp->word->word);
tmp = tmp->next;
assert(tmp);
assert_strequal("parse_pipelines.c", tmp->word->word);
tmp = tmp->next;
assert(tmp);
assert_strequal("parse_simple_cmds.c", tmp->word->word);
tmp = tmp->next;
assert(tmp);
assert_strequal("test_env_manip.c", tmp->word->word);
tmp = tmp->next;
assert(tmp);
assert_strequal("testutil.c", tmp->word->word);
tmp = tmp->next;
assert(tmp);
assert_strequal("testutil.h", tmp->word->word);
tmp = tmp->next;
assert(tmp);
assert_strequal("word_splitting.c", tmp->word->word);
tmp = tmp->next;
assert(!tmp);
wordlist_destroy(expanded);
worddesc_destroy(filepattern);
//test2
filepattern = create_single_word("**bla'b'*la*");
expanded = expand_star(filepattern);
assert(wordlist_size(expanded) == 1);
assert_strequal("blabla", expanded->word->word);
worddesc_destroy(filepattern);
wordlist_destroy(expanded);
//test zero résultat
filepattern = create_single_word("e*x***p*b");
expanded = expand_star(filepattern);
worddesc_destroy(filepattern);
assert(!expanded);
wordlist_destroy(expanded);
}
void simple_sub_test(void)
{
t_wordlist *list;
t_minishell *app;
char *value;
char *key;
value = ft_strdup("val");
key = ft_strdup("KEY");
app = ft_calloc(1, sizeof(t_minishell));
app->env = env_set_entry(&(app->env), key, value);
list = minishell_wordsplit("v$KEY");
list = wordlist_var_expansion(list, app);
assert_strequal("vval", list->word->word);
wordlist_destroy(list);
env_destroy(app->env);
free(app);
}
int main(void)
{
simple_sub_test();
test_insert_instr();
test_env_variable_expansion();
test_filename_path_expansion();
test_cmd_path_expansion();
test_filename_star_expansion();
return (0);
}