You need to quote your variables. Without quotes you are writing
test -n instead of
test -n <expression>. The
test command has no idea that you provided a variable that expanded to nothing.
In shell syntax,
$VARIABLE outside of double quotes is the “split+glob” operator: the value of the variable is split into a list of whitespace-delimited words, and each word is interpreted as a wildcard pattern and replaced by the names of matching files (or left alone if there is no matching file). If the value of the variable is empty, the list of words after splitting is an empty list. To obtain the value of the variable without further processing, the variable expansion needs to be inside double quotes.
[[ works is because it's a bash special syntax and not a command; within this special syntax,
$VARIABLE means “value of
VARIABLE” (except on the right-hand side of the pattern matching operators
[ would function the same as
test. The following does what you want:
test -n "$undeclared_variable" && echo "Foo"