Number guessing game tests 8 and 13 won't pass

Hey folks,

I’m hungry for this certificate, it’s been a long and trouble full road going through it. I would highly appreciate if someone could spare a minute to go over my code and see why I can’t pass these two tricky tests I’ve been trying to pass for hours.

The program functions as expected and I can see the test users in PSQL afterwards, but these two tests never seem to pass.

Here is my number_guess.sh:

#!/bin/bash

PSQL="psql -X --username=freecodecamp --dbname=users --no-align --tuples-only -c"

NUMBER=$(( $RANDOM % 1000 + 1 ))

echo -e "\nEnter your username:"
read USERNAME

USERID=$($PSQL "SELECT user_id FROM users WHERE username='$USERNAME'")

if [[ ! -z $USERID ]] 
then
  GAMES_PLAYED=$($PSQL "SELECT games_played FROM users WHERE username='$USERNAME'")
  BEST_GAME=$($PSQL "SELECT best_game FROM users WHERE username='$USERNAME'")
  echo "Welcome back, $USERNAME! You have played $GAMES_PLAYED games, and your best game took $BEST_GAME guesses."
else
  echo "Welcome, $USERNAME! It looks like this is your first time here."
  $PSQL "INSERT INTO users(username) VALUES('$USERNAME')" | echo 
  GAMES_PLAYED=0
  BEST_GAME=0
fi
echo -e "\nGuess the secret number between 1 and 1000:"

GUESSES() {
  read GUESS
  COUNTER=$1

  if [[ $GUESS =~ ^[0-9]+$ ]]
  then
    if [[ $GUESS = $NUMBER ]]
    then 
      echo -e "You guessed it in $COUNTER tries. The secret number was $GUESS. Nice job!"
      $PSQL "UPDATE users SET games_played='$(( $GAMES_PLAYED + 1 ))' WHERE username='$USERNAME'" | echo
      if [[ $COUNTER < $BEST_GAME || $BEST_GAME = 0 ]]
      then
        $PSQL "UPDATE users SET best_game='$COUNTER' WHERE username='$USERNAME'" | echo
      fi
    elif [[ $GUESS > $NUMBER ]]
    then
      echo -e "It's lower than that, guess again:\n"
      GUESSES $(( $COUNTER + 1 ))
    else 
      echo -e "It's higher than that, guess again:\n"
      GUESSES $(( $COUNTER + 1 ))
    fi
  else
    echo -e "That is not an integer, guess again:\n"
    GUESSES $COUNTER
  fi
}

GUESSES 1

and here is SQL dump:

--
-- PostgreSQL database dump
--

-- Dumped from database version 12.9 (Ubuntu 12.9-2.pgdg20.04+1)
-- Dumped by pg_dump version 12.9 (Ubuntu 12.9-2.pgdg20.04+1)

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;

DROP DATABASE users;
--
-- Name: users; Type: DATABASE; Schema: -; Owner: freecodecamp
--

CREATE DATABASE users WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'C.UTF-8' LC_CTYPE = 'C.UTF-8';


ALTER DATABASE users OWNER TO freecodecamp;

\connect users

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET xmloption = content;
SET client_min_messages = warning;
SET row_security = off;

SET default_tablespace = '';

SET default_table_access_method = heap;

--
-- Name: users; Type: TABLE; Schema: public; Owner: freecodecamp
--

CREATE TABLE public.users (
    user_id integer NOT NULL,
    username character varying(30) NOT NULL,
    games_played integer,
    best_game integer
);


ALTER TABLE public.users OWNER TO freecodecamp;

--
-- Name: users_user_id_seq; Type: SEQUENCE; Schema: public; Owner: freecodecamp
--

CREATE SEQUENCE public.users_user_id_seq
    AS integer
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;


ALTER TABLE public.users_user_id_seq OWNER TO freecodecamp;

--
-- Name: users_user_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: freecodecamp
--

ALTER SEQUENCE public.users_user_id_seq OWNED BY public.users.user_id;


--
-- Name: users user_id; Type: DEFAULT; Schema: public; Owner: freecodecamp
--

ALTER TABLE ONLY public.users ALTER COLUMN user_id SET DEFAULT nextval('public.users_user_id_seq'::regclass);


--
-- Data for Name: users; Type: TABLE DATA; Schema: public; Owner: freecodecamp
--



--
-- Name: users_user_id_seq; Type: SEQUENCE SET; Schema: public; Owner: freecodecamp
--

SELECT pg_catalog.setval('public.users_user_id_seq', 113, true);


--
-- Name: users users_pkey; Type: CONSTRAINT; Schema: public; Owner: freecodecamp
--

ALTER TABLE ONLY public.users
    ADD CONSTRAINT users_pkey PRIMARY KEY (user_id);


--
-- Name: users users_username_key; Type: CONSTRAINT; Schema: public; Owner: freecodecamp
--

ALTER TABLE ONLY public.users
    ADD CONSTRAINT users_username_key UNIQUE (username);


--
-- PostgreSQL database dump complete
--


Thank you!
Vlad

Please share the specific details of the failing tests.


Here you go

Generally tests are failing, because of difference between the number of guesses and the secret number, and number of guesses test made.

Test is doing that in a bit peculiar way, but the bottom line is - after starting the game it assumes, every line printed out (even if it’s actually empty) means the previous guess was wrong, and test makes another guess.

This means - make sure the game isn’t printing anywhere any not needed blank lines.

Thank you sanity! That worked, I made sure to delete all extra printed lines and the tests passed.

I really feel like that should be a note in the instructions of the test, or change the test to only count actual inputs…

I’d agree it can be confusing and such problem can be very hard to pin-point. Would you be interested in creating issue on the github for this Sign in to GitHub · GitHub?

Sure I can do that, I’ll create an issue right now

1 Like