#!/bin/sh die () { printf "$@" ; exit 1; } \. ../../../nvm.sh BASIC_VERSIONS='1.2.3 10.21.32 x.x.x X.X.X *.*.* 1.2 10.21 x.x X.X *.* 1 10 x * X' SEMVER_OPERATORS='v = < > <= >= ~ ^' # Dynamically generate list of semver expressions to test inside each package.json template. # Each semver added to this list is paired with the expected output when executed with nvm_get_node_from_pkg_json. # Most valid semvers will expecte the output to be the same as the input but there are some valid semvers with certain # sequences of tabs/spaces whose outputs are slightly different from their inputs (documented below). # Format for test cases is input and expected output separated by a colon # INPUT:EXPECTED_OUTPUT TEST_SEMVERS='' BASIC_VERSIONS_COPY=$(echo "$BASIC_VERSIONS") while [ -n "$BASIC_VERSIONS_COPY" ]; do BASIC_VERSION=$(echo "$BASIC_VERSIONS_COPY" | head -n1) BASIC_VERSIONS_COPY=$(echo "$BASIC_VERSIONS_COPY" | tail -n +2) # add test semver with just the version and no comparator TEST_SEMVERS="$TEST_SEMVERS $BASIC_VERSION:$BASIC_VERSION" SEMVER_OPERATORS_COPY=$(echo "$SEMVER_OPERATORS") while [ -n "$SEMVER_OPERATORS_COPY" ]; do SEMVER_OPERATOR=$(echo "$SEMVER_OPERATORS_COPY" | head -n1) SEMVER_OPERATORS_COPY=$(echo "$SEMVER_OPERATORS_COPY" | tail -n +2) # add test semver with version adjacent to operator # add test semver with version separated from operator by one space TEST_SEMVERS="$TEST_SEMVERS $SEMVER_OPERATOR$BASIC_VERSION:$SEMVER_OPERATOR$BASIC_VERSION $SEMVER_OPERATOR $BASIC_VERSION:$SEMVER_OPERATOR $BASIC_VERSION" done done # add valid basic test semvers with hyphen ranges TEST_SEMVERS="$TEST_SEMVERS 1.2.3 - 1.2.4:1.2.3 - 1.2.4 10.21.32 - 10.21.33:10.21.32 - 10.21.33 1.2 - 1.3:1.2 - 1.3 10.21 - 10.22:10.21 - 10.22 1 - 2:1 - 2 10 - 11:10 - 11" # add more complex test semvers with just one comparator set TEST_SEMVERS="$TEST_SEMVERS 1.2.3 1.2.4:1.2.3 1.2.4 1.2 1.3:1.2 1.3 1 2:1 2 >1.2.3 <=1.3.0:>1.2.3 <=1.3.0" # add test semvers with multiple comparator sets TEST_SEMVERS="$TEST_SEMVERS 1.2.3 || 1.2.4:1.2.3 || 1.2.4 1.2 || 1.3:1.2 || 1.3 1 || 2:1 || 2" # add test semvers that will be successfully extracted from package.json # but will be marked invalid upon going through nvm_validate_semver TEST_SEMVERS="$TEST_SEMVERS 1.2.3||1.2.4:1.2.3||1.2.4 1.2||1.3:1.2||1.3 1||2:1||2 <1.2.3>:<1.2.3> <1.2>:<1.2> <1>:<1> >>1:>>1 <<1:<<1 ==1:==1 **:** xx:xx ^^1:^^1 ~~1:~~1 1.2.3-1.2.4:1.2.3-1.2.4 10.21.32-10.21.33:10.21.32-10.21.33 1.2-1.3:1.2-1.3 10.21-10.22:10.21-10.22 1-2:1-2 10-11:10-11" # add test semvers with tabs inside them # These semvers are intended to: # - validate that semvers can include tabs # - validate that all tabs or consecutive tabs are reduced to one space # - validate that leading trailing spaces and tabs are removed TEST_SEMVERS="$TEST_SEMVERS 1 1 :1 1 2 2 :2 2" # POSITIVE TEST CASES # (TEST SET #1) uses valid TEST_SEMVER's and valid package.json templates TEST_SEMVERS_COPY=$(echo "$TEST_SEMVERS") PREV_TEST_SEMVER='' for TEMPLATE_NAME in package_json_templates/_valid_*; do while [ -n "$TEST_SEMVERS_COPY" ]; do LINE=$(echo "$TEST_SEMVERS_COPY" | head -n1) TEST_SEMVERS_COPY=$(echo "$TEST_SEMVERS_COPY" | tail -n +2) [ -n "$LINE" ] || continue TEST_SEMVER_INPUT=$(echo "$LINE" | awk -F: '{ print $1 }') EXPECTED_OUTPUT=$(echo "$LINE" | awk -F: '{ print $2 }') if [ "$PREV_TEST_SEMVER" == "$TEST_SEMVER_INPUT" ]; then die "Problem iterating through TEST_SEMVERS_COPY (TEST SET #1). Encountered the same value twice in a row. PREV_TEST_SEMVER='$PREV_TEST_SEMVER' TEST_SEMVER_INPUT='$TEST_SEMVER_INPUT'.\n" fi PREV_TEST_SEMVER=$(printf "%s" "$TEST_SEMVER_INPUT") PKG_JSON_CONTENTS=$(sed 's/NODE_SEMVER/'"$TEST_SEMVER_INPUT"'/g' "$TEMPLATE_NAME" | tail -n +3) ACTUAL_OUTPUT=$(nvm_get_node_from_pkg_json "$PKG_JSON_CONTENTS") if [ "$ACTUAL_OUTPUT" != "$EXPECTED_OUTPUT" ] || [ -z "$ACTUAL_OUTPUT" ] || [ -z "$PKG_JSON_CONTENTS" ]; then die "'nvm_get_node_from_pkg_json' POSITIVE test case failed (TEST SET #1). Expected '$EXPECTED_OUTPUT' but got '$ACTUAL_OUTPUT' when given input template '$TEMPLATE_NAME':\n$PKG_JSON_CONTENTS" fi done done # NEGATIVE TEST CASES # (TEST SET #2) uses valid TEST_SEMVER's but invalid package.json templates TEST_SEMVERS_COPY=$(echo "$TEST_SEMVERS") PREV_TEST_SEMVER='' for TEMPLATE_NAME in package_json_templates/_invalid_*; do while [ -n "$TEST_SEMVERS_COPY" ]; do LINE=$(echo "$TEST_SEMVERS_COPY" | head -n1) TEST_SEMVERS_COPY=$(echo "$TEST_SEMVERS_COPY" | tail -n +2) [ -n "$LINE" ] || continue TEST_SEMVER_INPUT=$(echo "$LINE" | awk -F: '{ print $1 }') if [ "$PREV_TEST_SEMVER" == "$TEST_SEMVER_INPUT" ]; then die "Problem iterating through TEST_SEMVERS_COPY (TEST SET #2). Encountered the same value twice in a row. PREV_TEST_SEMVER='$PREV_TEST_SEMVER' TEST_SEMVER_INPUT='$TEST_SEMVER_INPUT'.\n" fi PREV_TEST_SEMVER=$(printf "%s" "$TEST_SEMVER_INPUT") PKG_JSON_CONTENTS=$(sed 's/NODE_SEMVER/'"$TEST_SEMVER_INPUT"'/g' "$TEMPLATE_NAME" | tail -n +3) ACTUAL_OUTPUT=$(nvm_get_node_from_pkg_json "$PKG_JSON_CONTENTS") if [ "$ACTUAL_OUTPUT" != "" ] || [ -z "$TEST_SEMVER_INPUT" ] || [ -z "$PKG_JSON_CONTENTS" ]; then die "'nvm_get_node_from_pkg_json' NEGATIVE test case failed (TEST SET #2). Expected to get empty string but got '$ACTUAL_OUTPUT' when given input template '$TEMPLATE_NAME':\n$PKG_JSON_CONTENTS" fi done done # invalid test semvers TEST_SEMVERS='&1 @1 #1 $1 %s 1) 1( 1_ 1+ 1] 1[ 1" 1: 1? 1` 1!' # (TEST SET #3) uses invalid TEST_SEMVER's but valid package.json templates TEST_SEMVERS_COPY=$(echo "$TEST_SEMVERS") PREV_TEST_SEMVER='' for TEMPLATE_NAME in package_json_templates/_valid_*; do while [ -n "$TEST_SEMVERS_COPY" ]; do TEST_SEMVER_INPUT=$(echo "$TEST_SEMVERS_COPY" | head -n1) [ -n "$TEST_SEMVER_INPUT" ] || continue TEST_SEMVERS_COPY=$(echo "$TEST_SEMVERS_COPY" | tail -n +2) if [ "$PREV_TEST_SEMVER" == "$TEST_SEMVER_INPUT" ]; then die "Problem iterating through TEST_SEMVERS_COPY (TEST SET #3). Encountered the same value twice in a row. PREV_TEST_SEMVER='$PREV_TEST_SEMVER' TEST_SEMVER_INPUT='$TEST_SEMVER_INPUT'.\n" fi PREV_TEST_SEMVER=$(printf "%s" "$TEST_SEMVER_INPUT") PKG_JSON_CONTENTS=$(sed 's/NODE_SEMVER/'"$TEST_SEMVER_INPUT"'/g' "$TEMPLATE_NAME" | tail -n +3) ACTUAL_OUTPUT=$(nvm_get_node_from_pkg_json "$PKG_JSON_CONTENTS") if [ "$ACTUAL_OUTPUT" != "" ] || [ -z "$TEST_SEMVER_INPUT" ] || [ -z "$PKG_JSON_CONTENTS" ]; then die "'nvm_get_node_from_pkg_json' NEGATIVE test case failed (TEST SET #3). Expected to get empty string but got '$ACTUAL_OUTPUT' when given input template '$TEMPLATE_NAME':\n$PKG_JSON_CONTENTS" fi done done # (TEST SET #4) uses invalid TEST_SEMVER's and invalid package.json templates TEST_SEMVERS_COPY=$(echo "$TEST_SEMVERS") PREV_TEST_SEMVER='' for TEMPLATE_NAME in package_json_templates/_invalid_*; do while [ -n "$TEST_SEMVERS_COPY" ]; do TEST_SEMVER_INPUT=$(echo "$TEST_SEMVERS_COPY" | head -n1) [ -n "$TEST_SEMVER_INPUT" ] || continue TEST_SEMVERS_COPY=$(echo "$TEST_SEMVERS_COPY" | tail -n +2) if [ "$PREV_TEST_SEMVER" == "$TEST_SEMVER_INPUT" ]; then die "Problem iterating through TEST_SEMVERS_COPY (TEST SET #4). Encountered the same value twice in a row. PREV_TEST_SEMVER='$PREV_TEST_SEMVER' TEST_SEMVER_INPUT='$TEST_SEMVER_INPUT'.\n" fi PREV_TEST_SEMVER=$(printf "%s" "$TEST_SEMVER_INPUT") PKG_JSON_CONTENTS=$(sed 's/NODE_SEMVER/'"$TEST_SEMVER_INPUT"'/g' "$TEMPLATE_NAME" | tail -n +3) ACTUAL_OUTPUT=$(nvm_get_node_from_pkg_json "$PKG_JSON_CONTENTS") if [ "$ACTUAL_OUTPUT" != "" ] || [ -z "$TEST_SEMVER_INPUT" ] || [ -z "$PKG_JSON_CONTENTS" ]; then die "'nvm_get_node_from_pkg_json' NEGATIVE test case failed (TEST SET #4). Expected to get empty string but got '$ACTUAL_OUTPUT' when given input template '$TEMPLATE_NAME':\n$PKG_JSON_CONTENTS" fi done done