TypedDevs / bashunit

A simple testing library for bash scripts. Test your bash scripts in the fastest and simplest way, discover the most modern bash testing library.
https://bashunit.typeddevs.com
MIT License
270 stars 21 forks source link

Multi-line strings not supported for assert_equals #269

Open Chemaclass opened 2 weeks ago

Chemaclass commented 2 weeks ago
Q A
OS macOS / Linux / Windows
Shell bash
bashunit version 0.12.0

Summary

Discovered: https://github.com/TypedDevs/bashunit/pull/266#issuecomment-2176591645

Current behavior

Would it make sense to emit an error in case of multi-line strings telling the user that its not supported?

I wish that would be possible (or know how to do that...), however, at this point:

function assert_equals() {
  local expected="$1"
  local actual="$2"
  # ... etc ...

The issue is that there is no possibility to know if the second argumnet is a line that belong the text from the first argument or is a real new argument. Does it make sense? Therefore, for example, in here:

function assert_contains() {
  local expected="$1"
  local actual_arr=("${@:2}")
  local actual=$(printf '%s\n' "${actual_arr[@]}")

  if ! [[ $actual == *"$expected"* ]]; then
  # ... etc

what I am doing is to gather together all args (starting from the 2nd), store it into actual_arr and then concat all items with a new line \n into actual and so I can manipulate them easier. Does it makes sense and helps understand the intrinsic issue coming from bash? At least, I didn't find another way around to make this work so far... Maybe at a future time we find a better way to do this, but for now, I think it's good enough if this works in your PHPStan CI 😄

Expected behavior

Either allow the functionality to work OR notify the user that it's not supported

staabm commented 2 weeks ago

I wonder whether this problem is related to IFS:

https://unix.stackexchange.com/questions/184863/what-is-the-meaning-of-ifs-n-in-bash-scripting

?