lots of exercises in java... from https://github.com/exercism/java

journey-test.sh 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. #!/bin/bash
  2. SCRIPTPATH=$( pushd `dirname $0` > /dev/null && pwd && popd > /dev/null )
  3. EXECPATH=$PWD
  4. XAPI_PID=""
  5. function on_exit() {
  6. echo ">>> on_exit()"
  7. if [ "$XAPI_PID" != "" ] ; then
  8. kill $XAPI_PID
  9. echo "Stopped X-API (pid=${XAPI_PID})"
  10. fi
  11. cd $EXECPATH
  12. echo "<<< on_exit()"
  13. }
  14. assert_gradle_installed() {
  15. echo ">>> assert_gradle_installed()"
  16. which gradle >/dev/null
  17. if [ $? != 0 ]; then
  18. echo "Gradle not found. This the Java build tool and is required."
  19. echo -e "Have you completed the setup instructions at https://github.com/exercism/xjava ?\n"
  20. echo "PATH=${PATH}"
  21. echo "aborting."
  22. exit 1
  23. fi
  24. echo "<<< assert_gradle_installed()"
  25. }
  26. assert_jq_installed() {
  27. echo ">>> assert_jq_installed()"
  28. which jq >/dev/null
  29. if [ $? != 0 ]; then
  30. echo "jq not found. This utility is used to parse the config.json file and is required."
  31. echo -e "Have you completed the setup instructions at https://github.com/exercism/xjava ?\n"
  32. echo "PATH=${PATH}"
  33. echo "aborting."
  34. exit 1
  35. fi
  36. echo "<<< assert_jq_installed()"
  37. }
  38. assert_required_ruby_installed() {
  39. echo ">>> assert_required_ruby_installed(\"$1\")"
  40. local RACKAPP_HOME="$1"
  41. pushd "${RACKAPP_HOME}" >/dev/null
  42. local CURRENT_RUBY_VER=`ruby --version | egrep --only-matching "[0-9]+\.[0-9]+\.[0-9]+"`
  43. local EXPECTED_RUBY_VER=`cat Gemfile | awk -F\' '/ruby /{print $2}'`
  44. popd >/dev/null
  45. if [ "$CURRENT_RUBY_VER" != "$EXPECTED_RUBY_VER" ]; then
  46. echo "${RACKAPP_HOME} requires Ruby ${EXPECTED_RUBY_VER}; current Ruby version is ${CURRENT_RUBY_VER}."
  47. echo -e "Ruby used: `which ruby`.\n"
  48. echo -e "Have you completed the setup instructions at https://github.com/exercism/xjava ?\n"
  49. echo "PATH=${PATH}"
  50. echo "aborting."
  51. exit 1
  52. fi
  53. echo "<<< assert_required_ruby_installed()"
  54. }
  55. clean_build() {
  56. echo ">>> clean_build(\"$1\", \"$2\")"
  57. local REPO_ROOT="$1"
  58. local BUILD_DIR="$2"
  59. if [ -d "$BUILD_DIR" ] ; then
  60. echo "Cleaning journey script build (${BUILD_DIR})."
  61. rm -rf "$BUILD_DIR"
  62. fi
  63. pushd ${REPO_ROOT}/exercises > /dev/null
  64. gradle clean
  65. popd > /dev/null
  66. echo "<<< clean_build()"
  67. }
  68. get_operating_system() {
  69. case $(uname) in
  70. (Darwin*)
  71. echo "mac";;
  72. (Linux*)
  73. echo "linux";;
  74. (Windows*)
  75. echo "windows";;
  76. (*)
  77. echo "linux";;
  78. esac
  79. }
  80. get_cpu_architecture() {
  81. case $(uname -m) in
  82. (*64*)
  83. echo 64bit;;
  84. (*686*)
  85. echo 32bit;;
  86. (*386*)
  87. echo 32bit;;
  88. (*)
  89. echo 64bit;;
  90. esac
  91. }
  92. fetch_exercism_cli() {
  93. echo ">>> fetch_exercism_cli(\"$1\", \"$2\", \"$3\")"
  94. local OS="$1"
  95. local ARCH="$2"
  96. local EXERCISM_HOME="$3"
  97. local LATEST=https://github.com/exercism/cli/releases/latest
  98. # "curl..." :: HTTP 302 headers, including "Location" -- URL to redirect to.
  99. # "awk..." :: pluck last path segment from "Location" (i.e. the version number)
  100. local VERSION="$(curl --head --silent $LATEST | awk -v FS=/ '/Location:/{print $NF}' | tr -d '\r')"
  101. local CLI_URL=https://github.com/exercism/cli/releases/download/${VERSION}/exercism-${OS}-${ARCH}.tgz
  102. mkdir -p ${EXERCISM_HOME}
  103. curl -s --location ${CLI_URL} | tar xz -C ${EXERCISM_HOME}
  104. echo "<<< fetch_exercism_cli()"
  105. }
  106. fetch_x_api() {
  107. echo ">>> fetch_x_api(\"$1\")"
  108. local XAPI_HOME="$1"
  109. git clone https://github.com/exercism/x-api ${XAPI_HOME}
  110. pushd ${XAPI_HOME} >/dev/null
  111. git submodule init -- metadata
  112. git submodule update
  113. rmdir tracks/java
  114. ln -s $REPO_ROOT tracks/java
  115. popd > /dev/null
  116. echo "<<< fetch_x_api()"
  117. }
  118. start_x_api() {
  119. echo ">>> start_x_api(\"$1\")"
  120. local XAPI_HOME="$1"
  121. pushd $XAPI_HOME >/dev/null
  122. SET_RUBY_VER_CMD="rbenv local 2.2.1"
  123. gem install bundler
  124. bundle install
  125. RACK_ENV=development rackup &
  126. XAPI_PID=$!
  127. sleep 5
  128. echo "X-API is running (pid=${XAPI_PID})."
  129. popd > /dev/null
  130. echo "<<< start_x_api()"
  131. }
  132. configure_exercism_cli() {
  133. echo ">>> configure_exercism_cli(\"$1\", \"$2\", $3)"
  134. local EXERCISM_HOME="$1"
  135. local EXERCISM_CONFIGFILE="$2"
  136. local XAPI_PORT=$3
  137. local EXERCISM="./exercism --config ${EXERCISM_CONFIGFILE}"
  138. mkdir -p "${EXERCISM_HOME}"
  139. pushd "${EXERCISM_HOME}" >/dev/null
  140. $EXERCISM configure --dir="${EXERCISM_HOME}"
  141. $EXERCISM configure --api http://localhost:${XAPI_PORT}
  142. $EXERCISM debug
  143. popd >/dev/null
  144. echo "<<< configure_exercism_cli()"
  145. }
  146. solve_all_exercises() {
  147. echo ">>> solve_all_exercises(\"$1\", \"$2\")"
  148. local EXERCISM_HOME="$1"
  149. local EXERCISM_CONFIGFILE="$2"
  150. local EXERCISM="./exercism --config ${EXERCISM_CONFIGFILE}"
  151. local EXERCISES=`cat config.json | jq '.problems []' --raw-output`
  152. local TOTAL_EXERCISES=`cat config.json | jq '.problems | length'`
  153. local CURRENT_EXERCISE_NUMBER=1
  154. pushd ${EXERCISM_HOME} >/dev/null
  155. for EXERCISE in $EXERCISES; do
  156. echo ''
  157. echo '****' Testing $EXERCISE '('$CURRENT_EXERCISE_NUMBER / $TOTAL_EXERCISES') ****'
  158. echo ''
  159. $EXERCISM fetch java $EXERCISE
  160. cp -R -H $REPO_ROOT/exercises/$EXERCISE/src/example/java/* $EXERCISM_HOME/java/$EXERCISE/src/main/java/
  161. pushd $EXERCISM_HOME/java/$EXERCISE/ >/dev/null
  162. gradle test
  163. popd >/dev/null
  164. CURRENT_EXERCISE_NUMBER=$((CURRENT_EXERCISE_NUMBER + 1))
  165. done
  166. popd >/dev/null
  167. }
  168. main() {
  169. # allow all functions to assume current working directory is repository root.
  170. cd "${SCRIPTPATH}/.."
  171. local REPO_ROOT="${PWD}"
  172. local BUILD_DIR="${REPO_ROOT}/build"
  173. local XAPI_HOME="${BUILD_DIR}/x-api"
  174. local EXERCISM_HOME="${BUILD_DIR}/exercism"
  175. local EXERCISM_CONFIGFILE=".journey-test.exercism.json"
  176. local XAPI_PORT=9292
  177. assert_gradle_installed
  178. assert_jq_installed
  179. clean_build "${REPO_ROOT}" "${BUILD_DIR}"
  180. fetch_exercism_cli $(get_operating_system) $(get_cpu_architecture) "${EXERCISM_HOME}"
  181. fetch_x_api "${XAPI_HOME}"
  182. assert_required_ruby_installed "${XAPI_HOME}"
  183. start_x_api "${XAPI_HOME}"
  184. configure_exercism_cli "${EXERCISM_HOME}" "${EXERCISM_CONFIGFILE}" "${XAPI_PORT}"
  185. solve_all_exercises "${EXERCISM_HOME}" "${EXERCISM_CONFIGFILE}"
  186. }
  187. ##########################################################################
  188. # Execution begins here...
  189. set -e
  190. trap on_exit EXIT
  191. main