Skip to content

Commit 8e33581

Browse files
author
edwmurph
committed
renamed function; minor refactors; added test coverage; identified remaining work
1 parent faadbf8 commit 8e33581

8 files changed

+152
-75
lines changed

nvm.sh

+8-11
Original file line numberDiff line numberDiff line change
@@ -317,23 +317,18 @@ nvm_string_contains_regexp() {
317317
# semver ::= comparator_set ( ' || ' comparator_set )*
318318
# comparator_set ::= comparator ( ' ' comparator )*
319319
# comparator ::= ( '<' | '<=' | '>' | '>=' | '' ) [0-9]+ '.' [0-9]+ '.' [0-9]+
320-
nvm_is_valid_semver() {
320+
nvm_is_normalized_semver() {
321321
nvm_string_contains_regexp "${1-}" '^( ?(<|<=|>|>=)?[0-9]+\.[0-9]+\.[0-9]+)+( \|\| ( ?(<|<=|>|>=)?[0-9]+\.[0-9]+\.[0-9]+)+)*$'
322322
}
323323

324324
nvm_trim_and_reduce_whitespace_to_one_space() {
325325
command printf '%s' "${1-}" |
326-
command tr -d '\n\r' |
327-
command tr '\t' ' ' |
326+
command tr '\n\r\t\v\b' ' ' |
328327
command tr -s ' ' |
329328
command sed 's/^ //; s/ $//; s/^ //'
330329
}
331330

332-
# Attempts to normalize the given semver to the following grammar:
333-
#
334-
# semver ::= comparator_set ( ' || ' comparator_set )*
335-
# comparator_set ::= comparator ( ' ' comparator )*
336-
# comparator ::= ( '<' | '<=' | '>' | '>=' | '' ) [0-9]+ '.' [0-9]+ '.' [0-9]+
331+
# Attempts to normalize the given semver to the grammar defined with the function nvm_is_normalized_semver
337332
nvm_normalize_semver() {
338333
# split the semantic version's comparator_set's onto their own lines for iteration
339334
local semver
@@ -475,7 +470,7 @@ nvm_normalize_semver() {
475470

476471
validated_semver=$(command printf '%s' "$validated_semver" | command sed -E 's/^ \|\| //')
477472

478-
if nvm_is_valid_semver "$validated_semver"; then
473+
if nvm_is_normalized_semver "$validated_semver"; then
479474
command printf '%s' "$validated_semver"
480475
else
481476
return 1
@@ -490,7 +485,7 @@ nvm_interpret_complex_semver() {
490485
semver="${1-}"
491486
local version_list
492487
version_list="${2-}" # expected to be sorted from oldest to newest
493-
if [ -z "$semver" ] || [ -z "$version_list" ] || ! nvm_is_valid_semver "$semver"; then
488+
if [ -z "$semver" ] || [ -z "$version_list" ] || ! nvm_is_normalized_semver "$semver"; then
494489
return 1
495490
fi
496491

@@ -506,6 +501,7 @@ nvm_interpret_complex_semver() {
506501
local current_comparator
507502
local stripped_version_from_comparator
508503
local highest_compatible_versions
504+
# TODO make this just always store the highest possible compatible version
509505
highest_compatible_versions=''
510506

511507
while [ -n "$semver" ]; do
@@ -521,6 +517,7 @@ nvm_interpret_complex_semver() {
521517
current_version=$(command printf '%s' "$version_list_copy" | command tail -n1 | command sed -E 's/^ +//;s/ +$//' | nvm_grep -o '^[0-9]\+\.[0-9]\+\.[0-9]\+$')
522518
version_list_copy=$(command printf '%s' "$version_list_copy" | command sed '$d')
523519
[ -n "$current_version" ] || continue
520+
# TODO if current_version is less than the highest version in highest_compatile_versions, no need to continue
524521

525522
# For each comparator in the current_comparator_set_copy:
526523
# - If current_version is compatible with all comparators, we know current_version is the newest compatible version
@@ -4078,7 +4075,7 @@ nvm() {
40784075
nvm_curl_libz_support nvm_command_info \
40794076
nvm_get_node_from_pkg_json nvm_find_package_json nvm_package_json_version \
40804077
nvm_interpret_node_semver nvm_interpret_simple_semver nvm_interpret_complex_semver nvm_normalize_semver \
4081-
nvm_is_valid_semver nvm_string_contains_regexp nvm_trim_and_reduce_whitespace_to_one_space \
4078+
nvm_is_normalized_semver nvm_string_contains_regexp nvm_trim_and_reduce_whitespace_to_one_space \
40824079
> /dev/null 2>&1
40834080
unset NVM_RC_VERSION NVM_NODEJS_ORG_MIRROR NVM_IOJS_ORG_MIRROR NVM_DIR \
40844081
NVM_CD_FLAGS NVM_BIN NVM_MAKE_JOBS \

test/fast/Unit tests/nvm_get_node_from_pkg_json

+37-24
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,24 @@
88

99

1010
# (TEST SET #1) uses valid TEST_SEMVER's and valid package.json templates
11-
test_semvers_copy="$VALID_SEMVERS_FOR_PKG_JSON"
11+
test_cases="$VALID_SEMVERS_FOR_PKG_JSON"
12+
if [ -z "$test_cases" ]; then
13+
die 'TEST SET 1 for nvm_get_node_from_pkg_json given an empty set of test cases'
14+
fi
1215
prev_semver=''
1316
for template_file_name in package_json_templates/_valid_*; do
14-
while [ -n "$test_semvers_copy" ]; do
15-
semver=$(echo "$test_semvers_copy" | head -n1)
16-
test_semvers_copy=$(echo "$test_semvers_copy" | tail -n +2)
17+
while [ -n "$test_cases" ]; do
18+
semver=$(echo "$test_cases" | head -n1)
19+
test_cases=$(echo "$test_cases" | tail -n +2)
1720
[ -n "$semver" ] || continue
1821
expectedOutput=$(nvm_trim_and_reduce_whitespace_to_one_space "$semver")
1922

2023
if [ "$prev_semver" = "$semver" ]; then
21-
die "Problem iterating through test_semvers_copy (TEST SET #1). Encountered the same value twice in a row. prev_semver='$prev_semver' semver='$semver'.\n"
24+
die "Problem iterating through test_cases (TEST SET #1). Encountered the same value twice in a row. prev_semver='$prev_semver' semver='$semver'.\n"
2225
fi
2326
prev_semver="$semver"
2427

25-
pkg_json_contents=$(sed 's/NODE_SEMVER/'"$semver"'/g' "$template_file_name" | tail -n +3)
28+
pkg_json_contents=$(sed "s/NODE_SEMVER/$semver/g" "$template_file_name" | tail -n +3)
2629
actual_output=$(nvm_get_node_from_pkg_json "$pkg_json_contents")
2730
if [ "$actual_output" != "$expectedOutput" ] || [ -z "$actual_output" ] || [ -z "$pkg_json_contents" ]; then
2831
die "'nvm_get_node_from_pkg_json' POSITIVE test case failed (TEST SET #1). Expected '$expectedOutput' but got '$actual_output' when given input '$semver' and template '$template_file_name':\n$pkg_json_contents"
@@ -35,20 +38,23 @@ done
3538

3639

3740
# (TEST SET #2) uses valid TEST_SEMVER's but invalid package.json templates
38-
test_semvers_copy="$VALID_SEMVERS_FOR_PKG_JSON"
41+
test_cases="$VALID_SEMVERS_FOR_PKG_JSON"
42+
if [ -z "$test_cases" ]; then
43+
die 'TEST SET 2 for nvm_get_node_from_pkg_json given an empty set of test cases'
44+
fi
3945
prev_semver=''
4046
for template_file_name in package_json_templates/_invalid_*; do
41-
while [ -n "$test_semvers_copy" ]; do
42-
semver=$(echo "$test_semvers_copy" | head -n1)
43-
test_semvers_copy=$(echo "$test_semvers_copy" | tail -n +2)
47+
while [ -n "$test_cases" ]; do
48+
semver=$(echo "$test_cases" | head -n1)
49+
test_cases=$(echo "$test_cases" | tail -n +2)
4450
[ -n "$semver" ] || continue
4551

4652
if [ "$prev_semver" = "$semver" ]; then
47-
die "Problem iterating through test_semvers_copy (TEST SET #2). Encountered the same value twice in a row. prev_semver='$prev_semver' semver='$semver'.\n"
53+
die "Problem iterating through test_cases (TEST SET #2). Encountered the same value twice in a row. prev_semver='$prev_semver' semver='$semver'.\n"
4854
fi
4955
prev_semver="$semver"
5056

51-
pkg_json_contents=$(sed 's/NODE_SEMVER/'"$semver"'/g' "$template_file_name" | tail -n +3)
57+
pkg_json_contents=$(sed "s/NODE_SEMVER/$semver/g" "$template_file_name" | tail -n +3)
5258
actual_output=$(nvm_get_node_from_pkg_json "$pkg_json_contents")
5359
if [ "$actual_output" != "" ] || [ -z "$semver" ] || [ -z "$pkg_json_contents" ]; then
5460
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_file_name':\n$pkg_json_contents"
@@ -58,20 +64,23 @@ done
5864

5965

6066
# (TEST SET #3) uses invalid TEST_SEMVER's but valid package.json templates
61-
test_semvers_copy="$INVALID_SEMVERS_FOR_PKG_JSON"
67+
test_cases="$INVALID_SEMVERS_FOR_PKG_JSON"
68+
if [ -z "$test_cases" ]; then
69+
die 'TEST SET 3 for nvm_get_node_from_pkg_json given an empty set of test cases'
70+
fi
6271
prev_semver=''
6372
for template_file_name in package_json_templates/_valid_*; do
64-
while [ -n "$test_semvers_copy" ]; do
65-
semver=$(echo "$test_semvers_copy" | head -n1)
73+
while [ -n "$test_cases" ]; do
74+
semver=$(echo "$test_cases" | head -n1)
6675
[ -n "$semver" ] || continue
67-
test_semvers_copy=$(echo "$test_semvers_copy" | tail -n +2)
76+
test_cases=$(echo "$test_cases" | tail -n +2)
6877

6978
if [ "$prev_semver" = "$semver" ]; then
70-
die "Problem iterating through test_semvers_copy (TEST SET #3). Encountered the same value twice in a row. prev_semver='$prev_semver' semver='$semver'.\n"
79+
die "Problem iterating through test_cases (TEST SET #3). Encountered the same value twice in a row. prev_semver='$prev_semver' semver='$semver'.\n"
7180
fi
7281
prev_semver=$(printf "%s" "$semver")
7382

74-
pkg_json_contents=$(sed 's/NODE_SEMVER/'"$semver"'/g' "$template_file_name" | tail -n +3)
83+
pkg_json_contents=$(sed "s/NODE_SEMVER/$semver/g" "$template_file_name" | tail -n +3)
7584
actual_output=$(nvm_get_node_from_pkg_json "$pkg_json_contents")
7685
if [ "$actual_output" != "" ] || [ -z "$semver" ] || [ -z "$pkg_json_contents" ]; then
7786
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_file_name':\n$pkg_json_contents"
@@ -80,24 +89,28 @@ for template_file_name in package_json_templates/_valid_*; do
8089
done
8190

8291
# (TEST SET #4) uses invalid TEST_SEMVER's and invalid package.json templates
83-
test_semvers_copy="$INVALID_SEMVERS_FOR_PKG_JSON"
92+
test_cases="$INVALID_SEMVERS_FOR_PKG_JSON"
93+
if [ -z "$test_cases" ]; then
94+
die 'TEST SET 4 for nvm_get_node_from_pkg_json given an empty set of test cases'
95+
fi
8496
prev_semver=''
8597
for template_file_name in package_json_templates/_invalid_*; do
86-
while [ -n "$test_semvers_copy" ]; do
87-
semver=$(echo "$test_semvers_copy" | head -n1)
98+
while [ -n "$test_cases" ]; do
99+
semver=$(echo "$test_cases" | head -n1)
88100
[ -n "$semver" ] || continue
89-
test_semvers_copy=$(echo "$test_semvers_copy" | tail -n +2)
101+
test_cases=$(echo "$test_cases" | tail -n +2)
90102

91103
if [ "$prev_semver" = "$semver" ]; then
92-
die "Problem iterating through test_semvers_copy (TEST SET #4). Encountered the same value twice in a row. prev_semver='$prev_semver' semver='$semver'.\n"
104+
die "Problem iterating through test_cases (TEST SET #4). Encountered the same value twice in a row. prev_semver='$prev_semver' semver='$semver'.\n"
93105
fi
94106
prev_semver=$(printf "%s" "$semver")
95107

96-
pkg_json_contents=$(sed 's/NODE_SEMVER/'"$semver"'/g' "$template_file_name" | tail -n +3)
108+
pkg_json_contents=$(sed "s/NODE_SEMVER/$semver/g" "$template_file_name" | tail -n +3)
97109
actual_output=$(nvm_get_node_from_pkg_json "$pkg_json_contents")
98110
if [ "$actual_output" != "" ] || [ -z "$semver" ] || [ -z "$pkg_json_contents" ]; then
99111
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_file_name':\n$pkg_json_contents"
100112
fi
101113
done
102114
done
115+
exit 0
103116

test/fast/Unit tests/nvm_is_valid_semver test/fast/Unit tests/nvm_is_normalized_semver

+8-8
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
\. ../../../nvm.sh
44
\. ../../generated_semvers.sh
55

6-
# nvm_is_valid_semver validates that given semvers adhere to the following grammer
6+
# nvm_is_normalized_semver validates that given semvers adhere to the following grammer
77
#
88
# semver ::= comparator_set ( ' || ' comparator_set )*
99
# comparator_set ::= comparator ( ' ' comparator )*
@@ -13,14 +13,14 @@
1313

1414
positive_test_cases="$VALID_NORMALIZED_SEMVERS"
1515
if [ -z "$positive_test_cases" ]; then
16-
die "positive test cases are empty"
16+
die 'positive test cases are empty'
1717
fi
1818

1919
prev_semver=''
2020
while [ -n "$positive_test_cases" ]; do
2121
semver=$(echo "$positive_test_cases" | head -n1)
22-
if [ -z "$semver" ] || ! nvm_is_valid_semver "$semver"; then
23-
die "nvm_string_contains_regexp POSITIVE test case failed. semver: '$semver'.\n"
22+
if [ -z "$semver" ] || ! nvm_is_normalized_semver "$semver"; then
23+
die "nvm_is_normalized_semver POSITIVE test case failed. semver: '$semver'.\n"
2424
fi
2525
if [ "$prev_semver" = "$semver" ]; then
2626
die "something is wrong. positive test cases received the same test case twice in a row. semver: '$semver'"
@@ -31,16 +31,16 @@ done
3131

3232
# NEGATIVE TEST CASES
3333

34-
negative_test_cases="$VALID_NON_NORMALIZED_SEMVERS"
34+
negative_test_cases=$(printf "%s\n%s" "$VALID_NON_NORMALIZED_SEMVERS" "$INVALID_SEMVERS_FOR_PKG_JSON")
3535
if [ -z "$negative_test_cases" ]; then
36-
die "negative test cases are empty"
36+
die 'negative test cases are empty'
3737
fi
3838

3939
prev_semver='initialized to non empty string'
4040
while [ -n "$negative_test_cases" ]; do
4141
semver=$(echo "$negative_test_cases" | head -n1)
42-
if nvm_is_valid_semver "$semver"; then
43-
die "nvm_string_contains_regexp NEGATIVE test case failed. semver: '$semver'.\n"
42+
if nvm_is_normalized_semver "$semver"; then
43+
die "nvm_is_normalized_semver NEGATIVE test case failed. semver: '$semver'.\n"
4444
fi
4545
if [ "$prev_semver" = "$semver" ]; then
4646
die "something is wrong. negative test cases received the same test case twice in a row. semver: '$semver'"

test/fast/Unit tests/nvm_normalize_semver

+47-3
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,36 @@
33
\. ../../../nvm.sh
44
\. ../../generated_semvers.sh
55

6-
# TODO add more test cases here
7-
# Some test cases should just test that valid semvers from 'Shared test tesources'/semvers just produce some result
6+
# TEST 1: Validate that for already normalized semvers, nvm_normalize_semver outputs the same semver.
7+
test_cases="$VALID_NORMALIZED_SEMVERS"
8+
if [ -z "$test_cases" ]; then
9+
die 'nvm_normalize_semver (TEST 1) was given an empty set of test cases'
10+
fi
11+
while [ -n "$test_cases" ]; do
12+
semver=$(echo "$test_cases" | head -n1)
13+
actual_output=$(nvm_normalize_semver "$semver")
14+
if [ -z "$semver" ] || [ "$semver" != "$actual_output" ]; then
15+
die "nvm_normalize_semver (TEST 1) test case failed. Expected output: '$semver'. Actual output: '$actual_output'. Input: '$semver'.\n"
16+
fi
17+
test_cases=$(echo "$test_cases" | tail -n +2)
18+
done
819

20+
21+
# TEST 2: Validate that non normalized valid semvers produce a normalized result
22+
test_cases="$VALID_NON_NORMALIZED_SEMVERS"
23+
if [ -z "$test_cases" ]; then
24+
die 'nvm_normalize_semver (TEST 2) was given an empty set of test cases'
25+
fi
26+
while [ -n "$test_cases" ]; do
27+
semver=$(echo "$test_cases" | head -n1)
28+
actual_output=$(nvm_normalize_semver "$semver")
29+
if [ -z "$semver" ] || [ -z "$actual_output" ] || [ "$semver" = "$actual_output" ]; then
30+
die "nvm_normalize_semver (TEST 2) test case failed. Expected output: '$semver'. Actual output: '$actual_output'. Input: '$semver'.\n"
31+
fi
32+
test_cases=$(echo "$test_cases" | tail -n +2)
33+
done
34+
35+
# TEST 3: Validate specific outputs for some specific inputs to nvm_normalize_semver.
936
# input:expected_output
1037
test_cases="1.2.3:1.2.3
1138
1.2.3 - 1.2.4:>=1.2.3 <=1.2.4
@@ -42,13 +69,30 @@ a || 1.2.3:
4269
^x.1.1:>0.0.0
4370
11.22.33:11.22.33"
4471

72+
if [ -z "$test_cases" ]; then
73+
die 'nvm_normalize_semver (TEST 3) was given an empty set of test cases'
74+
fi
4575
while [ -n "$test_cases" ]; do
4676
line=$(echo "$test_cases" | head -n1)
4777
input=$(echo "$line" | awk -F: '{ print $1 }')
4878
expected_output=$(echo "$line" | awk -F: '{ print $2 }')
4979
actual_output=$(nvm_normalize_semver "$input")
5080
if [ -z "$input" ] || [ "$actual_output" != "$expected_output" ]; then
51-
die "nvm_normalize_semver test case failed. Expected output: '$expected_output'. Actual output: '$actual_output'. Input: '$input'.\n"
81+
die "nvm_normalize_semver (TEST 3) test case failed. Expected output: '$expected_output'. Actual output: '$actual_output'. Input: '$input'.\n"
82+
fi
83+
test_cases=$(echo "$test_cases" | tail -n +2)
84+
done
85+
86+
# TEST 4: Validate that invalid semvers with invalid characters that shouldn't be retrieved from the package.json produce no result from nvm_normalize_semver
87+
test_cases="$INVALID_SEMVERS_FOR_PKG_JSON"
88+
if [ -z "$test_cases" ]; then
89+
die 'nvm_normalize_semver (TEST 4) was given an empty set of test cases'
90+
fi
91+
while [ -n "$test_cases" ]; do
92+
semver=$(echo "$test_cases" | head -n1)
93+
actual_output=$(nvm_normalize_semver "$semver")
94+
if [ -z "$semver" ] || [ -n "$actual_output" ]; then
95+
die "nvm_normalize_semver (TEST 4) test case failed. Expected no output but got: '$actual_output'. Input: '$semver'.\n"
5296
fi
5397
test_cases=$(echo "$test_cases" | tail -n +2)
5498
done

test/fast/Unit tests/nvm_string_contains_regexp

+10-21
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,30 @@
11
#!/bin/sh
22

3-
die () { printf "$@" ; exit 1; }
4-
53
\. ../../../nvm.sh
4+
\. ../../generated_semvers.sh
65

7-
valid_semver_regexp='^( ?(<|<=|>|>=|=|~|\^)?([0-9]+|x)\.([0-9]+|x)\.([0-9]+|x))+$'
6+
normalized_semver_regexp='^( ?(<|<=|>|>=)?[0-9]+\.[0-9]+\.[0-9]+)+( \|\| ( ?(<|<=|>|>=)?[0-9]+\.[0-9]+\.[0-9]+)+)*$'
87

98
# POSITIVE TEST CASES
109

11-
# TODO add more test cases
12-
# string:regexp
13-
test_cases="1.2.3:$valid_semver_regexp
14-
11.22.33:$valid_semver_regexp"
15-
10+
test_cases="$VALID_NORMALIZED_SEMVERS"
1611
while [ -n "$test_cases" ]; do
17-
line=$(echo "$test_cases" | head -n1)
18-
string=$(echo "$line" | awk -F: '{ print $1 }')
19-
regexp=$(echo "$line" | awk -F: '{ print $2 }')
20-
if [ -z "$regexp" ] || [ -z "$string" ] || ! nvm_string_contains_regexp "$string" "$regexp"; then
21-
die "nvm_string_contains_regexp POSITIVE test case failed. regexp: '$regexp'. string: '$string'.\n"
12+
string=$(echo "$test_cases" | head -n1)
13+
if [ -z "$normalized_semver_regexp" ] || [ -z "$string" ] || ! nvm_string_contains_regexp "$string" "$normalized_semver_regexp"; then
14+
die "nvm_string_contains_regexp POSITIVE test case failed. regexp: '$normalized_semver_regexp'. string: '$string'.\n"
2215
fi
2316
test_cases=$(echo "$test_cases" | tail -n +2)
2417
done
2518

2619
# NEGATIVE TEST CASES
2720

2821
# string:regexp
29-
test_cases="1.2.a:$valid_semver_regexp
30-
:$valid_semver_regexp
31-
11.22.a:$valid_semver_regexp"
22+
test_cases=$(printf "%s\n%s" "$VALID_NON_NORMALIZED_SEMVERS" "$INVALID_SEMVERS_FOR_PKG_JSON")
3223

3324
while [ -n "$test_cases" ]; do
34-
line=$(echo "$test_cases" | head -n1)
35-
string=$(echo "$line" | awk -F: '{ print $1 }')
36-
regexp=$(echo "$line" | awk -F: '{ print $2 }')
37-
if [ -z "$regexp" ] || nvm_string_contains_regexp "$string" "$regexp"; then
38-
die "nvm_string_contains_regexp NEGATIVE test case failed. regexp: '$regexp'. string: '$string'.\n"
25+
string=$(echo "$test_cases" | head -n1)
26+
if [ -z "$normalized_semver_regexp" ] || nvm_string_contains_regexp "$string" "$normalized_semver_regexp"; then
27+
die "nvm_string_contains_regexp NEGATIVE test case failed. regexp: '$normalized_semver_regexp'. string: '$string'.\n"
3928
fi
4029
test_cases=$(echo "$test_cases" | tail -n +2)
4130
done

0 commit comments

Comments
 (0)