<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Diego Novais</title>
    <description>The latest articles on Forem by Diego Novais (@dnovais).</description>
    <link>https://forem.com/dnovais</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F178546%2F3b8463cf-9794-47be-9392-4892b12a0bf2.jpg</url>
      <title>Forem: Diego Novais</title>
      <link>https://forem.com/dnovais</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dnovais"/>
    <language>en</language>
    <item>
      <title>O que eu gostaria de ter aprendido sobre rotas no Rails lá no início</title>
      <dc:creator>Diego Novais</dc:creator>
      <pubDate>Sat, 22 Mar 2025 18:40:49 +0000</pubDate>
      <link>https://forem.com/dnovais/o-que-eu-gostaria-de-ter-aprendido-sobre-rotas-no-rails-la-no-inicio-9f8</link>
      <guid>https://forem.com/dnovais/o-que-eu-gostaria-de-ter-aprendido-sobre-rotas-no-rails-la-no-inicio-9f8</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;As rotas no Rails são responsáveis por direcionar requisições HTTP para os controladores e suas respectivas ações. Elas são definidas no arquivo &lt;code&gt;config/routes.rb&lt;/code&gt; e seguem uma estrutura declarativa que facilita a organização e manutenção do código. Este mini guia apresenta os principais conceitos sobre rotas no Rails, de forma clara e objetiva.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Básico das Rotas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definição de Rota Simples
&lt;/h3&gt;

&lt;p&gt;As rotas básicas no Rails podem ser definidas de maneira direta. Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;draw&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s1"&gt;'home/index'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa rota faz com que uma requisição &lt;code&gt;GET&lt;/code&gt; para &lt;code&gt;/home/index&lt;/code&gt; seja direcionada para o &lt;code&gt;HomeController&lt;/code&gt;, ação &lt;code&gt;index&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rotas RESTful
&lt;/h3&gt;

&lt;p&gt;O Rails adota o padrão REST, permitindo a criação de rotas com um único comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;resources&lt;/span&gt; &lt;span class="ss"&gt;:posts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso gera automaticamente as sete rotas principais para um recurso &lt;code&gt;posts&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GET /posts&lt;/code&gt; → Lista todos os posts (index)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /posts/:id&lt;/code&gt; → Mostra um post específico (show)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /posts/new&lt;/code&gt; → Exibe o formulário de criação (new)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST /posts&lt;/code&gt; → Cria um novo post (create)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /posts/:id/edit&lt;/code&gt; → Exibe o formulário de edição (edit)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PATCH/PUT /posts/:id&lt;/code&gt; → Atualiza um post (update)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DELETE /posts/:id&lt;/code&gt; → Exclui um post (destroy)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Definindo um Recurso Manualmente (Sem &lt;code&gt;resources&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;Nem sempre usamos o helper &lt;code&gt;resources&lt;/code&gt;. Podemos definir manualmente as rotas para um recurso completo, como &lt;code&gt;countries&lt;/code&gt;, caso queiramos mais controle ou aprendizado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;get&lt;/span&gt;    &lt;span class="s1"&gt;'/countries'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="ss"&gt;to: &lt;/span&gt;&lt;span class="s1"&gt;'countries#index'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="ss"&gt;as: &lt;/span&gt;&lt;span class="s1"&gt;'countries'&lt;/span&gt;
&lt;span class="n"&gt;get&lt;/span&gt;    &lt;span class="s1"&gt;'/countries/new'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="ss"&gt;to: &lt;/span&gt;&lt;span class="s1"&gt;'countries#new'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="ss"&gt;as: &lt;/span&gt;&lt;span class="s1"&gt;'new_country'&lt;/span&gt;
&lt;span class="n"&gt;post&lt;/span&gt;   &lt;span class="s1"&gt;'/countries'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="ss"&gt;to: &lt;/span&gt;&lt;span class="s1"&gt;'countries#create'&lt;/span&gt;
&lt;span class="n"&gt;get&lt;/span&gt;    &lt;span class="s1"&gt;'/countries/:id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="ss"&gt;to: &lt;/span&gt;&lt;span class="s1"&gt;'countries#show'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="ss"&gt;as: &lt;/span&gt;&lt;span class="s1"&gt;'country'&lt;/span&gt;
&lt;span class="n"&gt;get&lt;/span&gt;    &lt;span class="s1"&gt;'/countries/:id/edit'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;to: &lt;/span&gt;&lt;span class="s1"&gt;'countries#edit'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="ss"&gt;as: &lt;/span&gt;&lt;span class="s1"&gt;'edit_country'&lt;/span&gt;
&lt;span class="n"&gt;patch&lt;/span&gt;  &lt;span class="s1"&gt;'/countries/:id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="ss"&gt;to: &lt;/span&gt;&lt;span class="s1"&gt;'countries#update'&lt;/span&gt;
&lt;span class="n"&gt;put&lt;/span&gt;    &lt;span class="s1"&gt;'/countries/:id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="ss"&gt;to: &lt;/span&gt;&lt;span class="s1"&gt;'countries#update'&lt;/span&gt;
&lt;span class="n"&gt;delete&lt;/span&gt; &lt;span class="s1"&gt;'/countries/:id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="ss"&gt;to: &lt;/span&gt;&lt;span class="s1"&gt;'countries#destroy'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Explicação
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GET &lt;code&gt;/countries&lt;/code&gt;&lt;/strong&gt; → Lista todos os países (&lt;code&gt;index&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GET &lt;code&gt;/countries/new&lt;/code&gt;&lt;/strong&gt; → Formulário de novo país (&lt;code&gt;new&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;POST &lt;code&gt;/countries&lt;/code&gt;&lt;/strong&gt; → Cria um novo país (&lt;code&gt;create&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GET &lt;code&gt;/countries/:id&lt;/code&gt;&lt;/strong&gt; → Exibe detalhes de um país (&lt;code&gt;show&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GET &lt;code&gt;/countries/:id/edit&lt;/code&gt;&lt;/strong&gt; → Formulário de edição (&lt;code&gt;edit&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PATCH/PUT &lt;code&gt;/countries/:id&lt;/code&gt;&lt;/strong&gt; → Atualiza o país (&lt;code&gt;update&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DELETE &lt;code&gt;/countries/:id&lt;/code&gt;&lt;/strong&gt; → Remove o país (&lt;code&gt;destroy&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Vantagens e Uso
&lt;/h3&gt;

&lt;p&gt;Essa abordagem é útil quando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Você quer personalizar cada rota com mais liberdade&lt;/li&gt;
&lt;li&gt;Deseja evitar geração automática de rotas não utilizadas&lt;/li&gt;
&lt;li&gt;Precisa de nomes específicos para as rotas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Além disso, os helpers de caminho continuam disponíveis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;countries_path&lt;/span&gt;
&lt;span class="n"&gt;new_country_path&lt;/span&gt;
&lt;span class="n"&gt;country_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@country&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;edit_country_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@country&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Rotas Aninhadas
&lt;/h2&gt;

&lt;p&gt;Quando há um relacionamento entre recursos, podemos usar rotas aninhadas para estruturar as URLs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;resources&lt;/span&gt; &lt;span class="ss"&gt;:countries&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;resources&lt;/span&gt; &lt;span class="ss"&gt;:states&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;resources&lt;/span&gt; &lt;span class="ss"&gt;:cities&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso gera caminhos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/countries/:country_id/states/:state_id/cities/:id&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Interpretando Paths em Rotas Profundas
&lt;/h2&gt;

&lt;p&gt;Entender como interpretar paths em rotas aninhadas é essencial para evitar erros e construir URLs corretamente. Vamos analisar um exemplo:&lt;/p&gt;

&lt;h3&gt;
  
  
  Estrutura de Rotas
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;resources&lt;/span&gt; &lt;span class="ss"&gt;:universities&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;resources&lt;/span&gt; &lt;span class="ss"&gt;:departments&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;resources&lt;/span&gt; &lt;span class="ss"&gt;:professors&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;member&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s1"&gt;'profile'&lt;/span&gt; &lt;span class="c1"&gt;# /universities/:university_id/departments/:department_id/professors/:id/profile&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Como Ler e Construir Helpers de Caminho
&lt;/h3&gt;

&lt;p&gt;Dado o exemplo acima, podemos identificar como construir corretamente as URLs.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para listar todos os departamentos de uma universidade:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="n"&gt;university_departments_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@university&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="c1"&gt;# =&amp;gt; '/universities/:university_id/departments'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Para acessar um departamento específico:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="n"&gt;university_department_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@university&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="vi"&gt;@department&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="c1"&gt;# =&amp;gt; '/universities/:university_id/departments/:id'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Para acessar os professores de um departamento específico:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="n"&gt;department_professors_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@university&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="vi"&gt;@department&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="c1"&gt;# =&amp;gt; '/universities/:university_id/departments/:department_id/professors'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Para acessar o perfil de um professor:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="n"&gt;profile_professor_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@university&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="vi"&gt;@department&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="vi"&gt;@professor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
  &lt;span class="c1"&gt;# =&amp;gt; '/universities/:university_id/departments/:department_id/professors/:id/profile'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dicas para Interpretação de Paths
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A ordem dos argumentos importa&lt;/strong&gt;: Sempre forneça os IDs dos recursos pais antes dos filhos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use &lt;code&gt;rake routes&lt;/code&gt;&lt;/strong&gt;: Esse comando exibe todas as rotas disponíveis e seus respectivos helpers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analise a hierarquia&lt;/strong&gt;: Cada recurso dentro de outro exige os IDs dos níveis superiores.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifique o nome dos helpers&lt;/strong&gt;: Rails gera nomes padronizados baseados na estrutura definida em &lt;code&gt;routes.rb&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Buscando Rotas Específicas
&lt;/h2&gt;

&lt;p&gt;Ao trabalhar com um grande número de rotas, pode ser desafiador encontrar uma específica. O Rails fornece algumas ferramentas para facilitar essa busca.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usando &lt;code&gt;rake routes | grep&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Podemos filtrar rotas usando &lt;code&gt;grep&lt;/code&gt; para encontrar apenas as que nos interessam:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rake routes | &lt;span class="nb"&gt;grep users&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso retorna apenas as rotas que contêm &lt;code&gt;users&lt;/code&gt; no nome ou caminho.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usando &lt;code&gt;rails routes -g&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Uma alternativa mais eficiente no Rails 5+ é o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rails routes &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="nb"&gt;users&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ele tem a mesma função do &lt;code&gt;grep&lt;/code&gt;, mas de forma mais otimizada, sem a necessidade de encadear comandos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nomeação e Redirecionamento
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Nomeando Rotas
&lt;/h3&gt;

&lt;p&gt;Nomear rotas facilita seu uso no código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s1"&gt;'about'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;to: &lt;/span&gt;&lt;span class="s1"&gt;'pages#about'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;as: &lt;/span&gt;&lt;span class="s1"&gt;'about_page'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora podemos chamar &lt;code&gt;about_page_path&lt;/code&gt; em vez de escrever manualmente &lt;code&gt;'/about'&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Redirecionamento de Rotas
&lt;/h3&gt;

&lt;p&gt;Podemos redirecionar URLs antigas para novas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s1"&gt;'/old_route'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;to: &lt;/span&gt;&lt;span class="n"&gt;redirect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/new_route'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;As rotas são fundamentais para qualquer aplicação Rails, permitindo estruturar URLs de forma eficiente e organizada. O uso de &lt;strong&gt;helpers de caminho&lt;/strong&gt; simplifica a navegação, enquanto &lt;strong&gt;rotas nomeadas e personalizadas&lt;/strong&gt; tornam o código mais legível e fácil de manter. Além disso, aprender a &lt;strong&gt;interpretar paths e buscar rotas específicas&lt;/strong&gt; com &lt;code&gt;rails routes -g&lt;/code&gt; ou &lt;code&gt;grep&lt;/code&gt; facilita a manutenção e depuração da aplicação. Com esse conhecimento, você pode criar aplicações escaláveis e bem estruturadas!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Ignore Files in Git Without Using .gitignore</title>
      <dc:creator>Diego Novais</dc:creator>
      <pubDate>Fri, 20 Sep 2024 05:28:20 +0000</pubDate>
      <link>https://forem.com/dnovais/how-to-ignore-files-in-git-without-using-gitignore-43o4</link>
      <guid>https://forem.com/dnovais/how-to-ignore-files-in-git-without-using-gitignore-43o4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;EN&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes you need to ignore files or folders in your project, but you don't want to add these rules to the shared .gitignore file. Git offers an elegant solution for this: the .git/info/exclude file. Let's explore how to use this functionality.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the .git/info/exclude file?
&lt;/h2&gt;

&lt;p&gt;The .git/info/exclude file works similarly to .gitignore, but it's specific to your local repository. The rules defined in it are not shared with other collaborators when you push your code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-step guide to using .git/info/exclude
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Locate the file&lt;/strong&gt;&lt;br&gt;
Navigate to the root folder of your Git repository and look for the hidden .git folder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create or edit the file&lt;/strong&gt;&lt;br&gt;
Inside the .git folder, go to the info folder. If a file named exclude doesn't exist, create it. Otherwise, open it for editing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Add the rules&lt;/strong&gt;&lt;br&gt;
The exclusion rules follow the same format as .gitignore. For example:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   # Ignore a specific folder
   my_folder/

   # Ignore a file type
   *.log

   # Ignore a specific file
   config.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Save the file&lt;/strong&gt;&lt;br&gt;
After adding your rules, save and close the file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verify it's working&lt;/strong&gt;&lt;br&gt;
Use the &lt;code&gt;git status&lt;/code&gt; command to confirm that the files/folders you want to ignore are not being tracked.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Advantages of using .git/info/exclude
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Privacy&lt;/strong&gt;: The rules are applied only locally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Doesn't affect other collaborators&lt;/strong&gt;: Your personal exclusions don't interfere with the team's work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ideal for specific configurations&lt;/strong&gt;: Perfect for local configuration files or temporary files in your development environment.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Important considerations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use relative paths for greater portability.&lt;/li&gt;
&lt;li&gt;Remember that files already tracked by Git won't be automatically ignored. You'll need to remove them from tracking first.&lt;/li&gt;
&lt;li&gt;If you need to share exclusion rules with the team, .gitignore is still the best option.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The .git/info/exclude file is a powerful tool for managing local exclusions in your Git repository. It offers flexibility to ignore files and folders without affecting the shared .gitignore, making it ideal for configurations specific to your development environment.&lt;/p&gt;

&lt;p&gt;By mastering this technique, you'll have more control over what is versioned in your local repository, keeping your workspace organized and avoiding accidental commits of unnecessary files.&lt;/p&gt;

&lt;p&gt;I hope that this content helps and makes sense to you! See ya!&lt;/p&gt;

&lt;p&gt;Contacts:&lt;br&gt;
Email: &lt;a href="mailto:contato@diegonovais.com.br"&gt;contato@diegonovais.com.br&lt;/a&gt;&lt;br&gt;
LinkedIn: &lt;a href="https://www.linkedin.com/in/diegonovais/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/diegonovais/&lt;/a&gt;&lt;br&gt;
Github: &lt;a href="https://github.com/dnovais" rel="noopener noreferrer"&gt;https://github.com/dnovais&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;PTBR:&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Como ignorar arquivos no Git sem usar o .gitignore
&lt;/h1&gt;

&lt;p&gt;Às vezes, você precisa ignorar arquivos ou pastas em seu projeto, mas não quer adicionar essas regras ao arquivo .gitignore compartilhado. O Git oferece uma solução elegante para isso: o arquivo .git/info/exclude. Vamos explorar como usar essa funcionalidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é o arquivo .git/info/exclude?
&lt;/h2&gt;

&lt;p&gt;O arquivo .git/info/exclude funciona de maneira similar ao .gitignore, mas é específico para o seu repositório local. As regras definidas nele não são compartilhadas com outros colaboradores quando você faz push do seu código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo a passo para usar o .git/info/exclude
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Localize o arquivo&lt;/strong&gt;&lt;br&gt;
Navegue até a pasta raiz do seu repositório Git e procure a pasta oculta .git.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Crie ou edite o arquivo&lt;/strong&gt;&lt;br&gt;
Dentro da pasta .git, vá para a pasta info. Se não existir um arquivo chamado exclude, crie-o. Caso contrário, abra-o para edição.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adicione as regras&lt;/strong&gt;&lt;br&gt;
As regras de exclusão seguem o mesmo formato do .gitignore. Por exemplo:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   # Ignorar uma pasta específica
   minha_pasta/

   # Ignorar um tipo de arquivo
   *.log

   # Ignorar um arquivo específico
   config.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Salve o arquivo&lt;/strong&gt;&lt;br&gt;
Após adicionar suas regras, salve e feche o arquivo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verifique se está funcionando&lt;/strong&gt;&lt;br&gt;
Use o comando &lt;code&gt;git status&lt;/code&gt; para confirmar se os arquivos/pastas que você quer ignorar não estão sendo rastreados.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Vantagens de usar .git/info/exclude
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Privacidade&lt;/strong&gt;: As regras são aplicadas apenas localmente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Não afeta outros colaboradores&lt;/strong&gt;: Suas exclusões pessoais não interferem no trabalho da equipe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ideal para configurações específicas&lt;/strong&gt;: Perfeito para arquivos de configuração local ou arquivos temporários do seu ambiente de desenvolvimento.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Considerações importantes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use caminhos relativos para maior portabilidade.&lt;/li&gt;
&lt;li&gt;Lembre-se que arquivos já rastreados pelo Git não serão ignorados automaticamente. Você precisará removê-los do rastreamento primeiro.&lt;/li&gt;
&lt;li&gt;Se você precisar compartilhar regras de exclusão com a equipe, o .gitignore ainda é a melhor opção.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O arquivo .git/info/exclude é uma ferramenta poderosa para gerenciar exclusões locais em seu repositório Git. Ele oferece flexibilidade para ignorar arquivos e pastas sem afetar o .gitignore compartilhado, tornando-o ideal para configurações específicas do seu ambiente de desenvolvimento.&lt;/p&gt;

&lt;p&gt;Ao dominar esta técnica, você terá mais controle sobre o que é versionado em seu repositório local, mantendo seu espaço de trabalho organizado e evitando commits acidentais de arquivos desnecessários.&lt;/p&gt;

&lt;p&gt;Espero que este conteúdo ajude e faça sentido para você! Até mais!&lt;/p&gt;

&lt;p&gt;Contato:&lt;br&gt;
Email: &lt;a href="mailto:contato@diegonovais.com.br"&gt;contato@diegonovais.com.br&lt;/a&gt;&lt;br&gt;
LinkedIn: &lt;a href="https://www.linkedin.com/in/diegonovais/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/diegonovais/&lt;/a&gt;&lt;br&gt;
Github: &lt;a href="https://github.com/dnovais" rel="noopener noreferrer"&gt;https://github.com/dnovais&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Simplify Your Rails Route Filtering with This Quick Tip</title>
      <dc:creator>Diego Novais</dc:creator>
      <pubDate>Tue, 03 Sep 2024 18:49:34 +0000</pubDate>
      <link>https://forem.com/dnovais/simplify-your-rails-route-filtering-with-this-quick-tip-f3h</link>
      <guid>https://forem.com/dnovais/simplify-your-rails-route-filtering-with-this-quick-tip-f3h</guid>
      <description>&lt;p&gt;EN:&lt;/p&gt;

&lt;h2&gt;
  
  
  TIL: Quick tip for Rails users!
&lt;/h2&gt;

&lt;p&gt;Instead of using &lt;code&gt;rails routes | grep articles&lt;/code&gt; to filter routes, try using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bin/rails routes -g articles
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes searching for routes simpler and more straightforward, without the need for grep.&lt;/p&gt;




&lt;p&gt;PT/BR:&lt;/p&gt;

&lt;h2&gt;
  
  
  TIL: Dica rápida para quem usa Rails!
&lt;/h2&gt;

&lt;p&gt;Em vez de usar &lt;code&gt;rails routes | grep articles&lt;/code&gt; para filtrar rotas, experimente usar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bin/rails routes -g articles
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso torna a busca por rotas mais simples e direta, sem precisar do grep.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>rails</category>
      <category>productivity</category>
      <category>developers</category>
    </item>
    <item>
      <title>4 Stages Of Problem Solving</title>
      <dc:creator>Diego Novais</dc:creator>
      <pubDate>Fri, 10 Mar 2023 01:17:10 +0000</pubDate>
      <link>https://forem.com/dnovais/4-stages-of-problem-solving-1fdd</link>
      <guid>https://forem.com/dnovais/4-stages-of-problem-solving-1fdd</guid>
      <description>&lt;p&gt;As software developers, we are faced with an array of tasks and problems that require our attention and expertise on a daily basis. To address these challenges, based on my studies, I rely on a problem-solving strategy that consists of four stages.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzxgsw28dzccqjj4lwz8q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzxgsw28dzccqjj4lwz8q.png" alt="4 Stages Of Problem Solving" width="687" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1 - Analyze
&lt;/h3&gt;

&lt;p&gt;The first stage involves understanding the available resources and constraints of the problem. By assessing the resources at our disposal and identifying any limitations, we can gain a clear understanding of what is required to solve the problem effectively.&lt;/p&gt;

&lt;h3&gt;
  
  
  2 - Plan
&lt;/h3&gt;

&lt;p&gt;The second stage is to write a program that outlines the steps needed to solve the problem. This plan of action serves as a roadmap that guides us toward a successful resolution.&lt;/p&gt;

&lt;h3&gt;
  
  
  3 - Implement
&lt;/h3&gt;

&lt;p&gt;The third stage is to execute the program to obtain the desired results. By doing so, we can confirm that our solution is indeed effective and meets the requirements of the problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  4 - Evaluate
&lt;/h3&gt;

&lt;p&gt;Lastly, we match the results of the program with the desired output to determine if the problem has been successfully solved. This allows us to verify that our solution is accurate and meets the expectations of the stakeholders involved.&lt;/p&gt;

&lt;p&gt;By following this four-stage problem-solving strategy, software developers can approach problems in a structured and systematic manner, leading to more efficient and effective solutions.&lt;/p&gt;

&lt;p&gt;This four-stage problem-solving strategy is not only effective in the context of software development but can also be applied to various real-life situations. By breaking down complex problems into smaller, more manageable steps and following a structured approach, we can approach challenges with greater confidence and achieve successful outcomes.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>algorithms</category>
      <category>strategy</category>
    </item>
    <item>
      <title>Refactoring the Game</title>
      <dc:creator>Diego Novais</dc:creator>
      <pubDate>Thu, 01 Sep 2022 05:15:49 +0000</pubDate>
      <link>https://forem.com/dnovais/refactoring-the-game-j7a</link>
      <guid>https://forem.com/dnovais/refactoring-the-game-j7a</guid>
      <description>&lt;p&gt;Our &lt;strong&gt;game&lt;/strong&gt; is almost finished (&lt;em&gt;at least part of it&lt;/em&gt;). But we can improve the module game and do it together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's start...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I found modular arithmetic, looking for something with a mathematical approach to solving the logic of our game (if you are interested in the subject, take a look &lt;a href="https://www.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/what-is-modular-arithmetic" rel="noopener noreferrer"&gt;here&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Now we'll use modular arithmetic to add a few math to our code. And make the code brighter and cleaner.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mathematical approach
&lt;/h2&gt;

&lt;p&gt;The mod function provides the remainder when one integer is divided by another. And it will help us to a cyclical relationship between the three choices: Rock, Paper, and Scissors.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;remainder&lt;/span&gt; &lt;span class="ow"&gt;when&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;divided&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, looking into our code, more specifically on module attributes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;  &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I saw a tip that can help us to make calculus more efficiently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Refactoring the Game
&lt;/h2&gt;

&lt;p&gt;Adding the function to calculate the result of the game &lt;code&gt;game_calc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nv"&gt;@moduledoc&lt;/span&gt; &lt;span class="sd"&gt;"""
  Documentation for `Game`.
  """&lt;/span&gt;

  &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="k"&gt;cond&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Draw!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Second player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Second player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Second player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;game_calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;rem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_item&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;second_player_item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then now, we can simplify the function result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nv"&gt;@moduledoc&lt;/span&gt; &lt;span class="sd"&gt;"""
  Documentation for `Game`.
  """&lt;/span&gt;

  &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;game_calc_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;game_calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;game_calc_result&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Draw!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Second player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;game_calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;rem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_item&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;second_player_item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Running the tests:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mix &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Something is wrong. We got three warnings and one failure message when we ran the tests.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Compiling 1 file &lt;span class="o"&gt;(&lt;/span&gt;.ex&lt;span class="o"&gt;)&lt;/span&gt;
warning: module attribute @scissor was &lt;span class="nb"&gt;set &lt;/span&gt;but never used
  lib/game.ex:8

warning: module attribute @paper was &lt;span class="nb"&gt;set &lt;/span&gt;but never used
  lib/game.ex:7

warning: module attribute @stone was &lt;span class="nb"&gt;set &lt;/span&gt;but never used
  lib/game.ex:6

..

  1&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;Game.play/2 when first player wins when first player chooses stone and second player chooses scissors &lt;span class="o"&gt;(&lt;/span&gt;GameTest&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:55
     Assertion with &lt;span class="o"&gt;==&lt;/span&gt; failed
     code:  assert match &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;
     left:  &lt;span class="s2"&gt;"Second player win!!!"&lt;/span&gt;
     right: &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;
     stacktrace:
       &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:61: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

......

Finished &lt;span class="k"&gt;in &lt;/span&gt;0.05 seconds &lt;span class="o"&gt;(&lt;/span&gt;0.00s async, 0.05s &lt;span class="nb"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
9 tests, 1 failure

Randomized with seed 811857
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To solve the warning messages, we need to remove the module attributes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nv"&gt;@moduledoc&lt;/span&gt; &lt;span class="sd"&gt;"""
  Documentation for `Game`.
  """&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;game_calc_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;game_calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;game_calc_result&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Draw!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Second player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;game_calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;rem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_item&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;second_player_item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now, if we rerun the tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mix &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We'll see only the tests failure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Compiling 1 file &lt;span class="o"&gt;(&lt;/span&gt;.ex&lt;span class="o"&gt;)&lt;/span&gt;
....

  1&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;Game.play/2 when first player wins when first player chooses stone and second player chooses scissors &lt;span class="o"&gt;(&lt;/span&gt;GameTest&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:55
     Assertion with &lt;span class="o"&gt;==&lt;/span&gt; failed
     code:  assert match &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;
     left:  &lt;span class="s2"&gt;"Second player win!!!"&lt;/span&gt;
     right: &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;
     stacktrace:
       &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:61: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

....

Finished &lt;span class="k"&gt;in &lt;/span&gt;0.04 seconds &lt;span class="o"&gt;(&lt;/span&gt;0.00s async, 0.04s &lt;span class="nb"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
9 tests, 1 failure

Randomized with seed 730068
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Understanding the failure message
&lt;/h3&gt;

&lt;p&gt;The failure is because we pass to kernel function rem/2 a dividend negative in our formula. And according to the documentation, this kernel function uses truncated division, which means that the result will always have the sign of the dividend.&lt;/p&gt;

&lt;p&gt;When first player wins when first player chooses stone and second player chooses scissors, the result is &lt;code&gt;-2&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# stone = 1&lt;/span&gt;
&lt;span class="c1"&gt;# paper = 2&lt;/span&gt;
&lt;span class="c1"&gt;# scissor = 3&lt;/span&gt;

&lt;span class="c1"&gt;# R = (first_player_choice - second_player_choice) % 3&lt;/span&gt;
&lt;span class="c1"&gt;# R = (stone - scissors) % 3&lt;/span&gt;
&lt;span class="c1"&gt;# R = (1 - 3) % 3&lt;/span&gt;

&lt;span class="c1"&gt;# In elixir using rem/2&lt;/span&gt;

&lt;span class="n"&gt;rem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Solving the failure message
&lt;/h3&gt;

&lt;p&gt;According to the documentation, the function &lt;code&gt;Integer.mod/2&lt;/code&gt; Computes the modulo remainder of an integer division.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's important to know:&lt;/strong&gt; &lt;code&gt;Integer.mod/2&lt;/code&gt; uses floored division, which means that the result will always have the sign of the divisor.&lt;/p&gt;

&lt;p&gt;So, when first player wins when first player chooses stone and second player chooses scissors, the result is &lt;code&gt;1&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# stone = 1&lt;/span&gt;
&lt;span class="c1"&gt;# paper = 2&lt;/span&gt;
&lt;span class="c1"&gt;# scissor = 3&lt;/span&gt;

&lt;span class="c1"&gt;# R = (first_player_choice - second_player_choice) % 3&lt;/span&gt;
&lt;span class="c1"&gt;# R = (stone - scissors) % 3&lt;/span&gt;
&lt;span class="c1"&gt;# R = (1 - 3) % 3&lt;/span&gt;

&lt;span class="c1"&gt;# In elixir using rem/2&lt;/span&gt;

&lt;span class="no"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, To solve the failure message, we need to remove the rem/2 function and add the Integer.mod/2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nv"&gt;@moduledoc&lt;/span&gt; &lt;span class="sd"&gt;"""
  Documentation for `Game`.
  """&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;game_calc_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;game_calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;game_calc_result&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Draw!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Second player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;game_calc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="no"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_item&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;second_player_item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now, finally, if we rerun the tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mix &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All the tests pass with success \o/:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Compiling 1 file &lt;span class="o"&gt;(&lt;/span&gt;.ex&lt;span class="o"&gt;)&lt;/span&gt;
.........

Finished &lt;span class="k"&gt;in &lt;/span&gt;0.04 seconds &lt;span class="o"&gt;(&lt;/span&gt;0.00s async, 0.04s &lt;span class="nb"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
9 tests, 0 failures

Randomized with seed 992719
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's &lt;strong&gt;time to celebrate&lt;/strong&gt;, the game &lt;strong&gt;Rock, Paper, and Scissors&lt;/strong&gt; is &lt;strong&gt;"done"&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository of the project:&lt;/strong&gt; &lt;a href="https://github.com/dnovais/rock_paper_scissor_elixir" rel="noopener noreferrer"&gt;https://github.com/dnovais/rock_paper_scissor_elixir&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See you soon!&lt;/p&gt;

&lt;h3&gt;
  
  
  Contacts
&lt;/h3&gt;

&lt;p&gt;Email: &lt;a href="mailto:contato@diegonovais.com.br"&gt;contato@diegonovais.com.br&lt;/a&gt;&lt;br&gt;
Linkedin: &lt;a href="https://www.linkedin.com/in/diegonovais/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/diegonovais/&lt;/a&gt;&lt;br&gt;
Twitter: &lt;a href="https://twitter.com/diegonovaistech" rel="noopener noreferrer"&gt;https://twitter.com/diegonovaistech&lt;/a&gt;&lt;/p&gt;




&lt;h4&gt;
  
  
  Sources and references
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hexdocs.pm/elixir/1.12/Integer.html#mod/2" rel="noopener noreferrer"&gt;https://hexdocs.pm/elixir/1.12/Integer.html#mod/2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cs.drexel.edu/%7Ejpopyack/Courses/CSP/Fa18/notes/CS150_RockPaperScissors_Revisited.pdf" rel="noopener noreferrer"&gt;https://www.cs.drexel.edu/~jpopyack/Courses/CSP/Fa18/notes/CS150_RockPaperScissors_Revisited.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cin.ufpe.br/%7Egdcc/matdis/aulas/aritmeticaModular.pdf" rel="noopener noreferrer"&gt;https://www.cin.ufpe.br/~gdcc/matdis/aulas/aritmeticaModular.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/what-is-modular-arithmetic" rel="noopener noreferrer"&gt;https://www.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/what-is-modular-arithmetic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>elixir</category>
      <category>algorithms</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Second player wins! Building the code and make the tests pass</title>
      <dc:creator>Diego Novais</dc:creator>
      <pubDate>Wed, 31 Aug 2022 18:59:07 +0000</pubDate>
      <link>https://forem.com/dnovais/second-player-wins-building-the-code-and-make-the-tests-pass-5dh3</link>
      <guid>https://forem.com/dnovais/second-player-wins-building-the-code-and-make-the-tests-pass-5dh3</guid>
      <description>&lt;p&gt;Now, according to our tests, we'll add the condition that guarantees that the &lt;strong&gt;second player is the winner&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Our Game module looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# lib/game.ex&lt;/span&gt;

&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nv"&gt;@moduledoc&lt;/span&gt; &lt;span class="sd"&gt;"""
  Documentation for `Game`.
  """&lt;/span&gt;
  &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="k"&gt;cond&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Draw!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;If we run the tests now:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;mix&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;We'll see the tests failures:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;..

  1&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;Game.play/2 when second player wins when second player chooses stone and first player chooses scissors &lt;span class="o"&gt;(&lt;/span&gt;GameTest&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:85
     &lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;CondClauseError&lt;span class="o"&gt;)&lt;/span&gt; no cond clause evaluated to a truthy value
     code: assert &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;first_player_choice, second_player_choise&lt;span class="o"&gt;)&lt;/span&gt;
     stacktrace:
       &lt;span class="o"&gt;(&lt;/span&gt;rock_paper_scissor_elixir 0.1.0&lt;span class="o"&gt;)&lt;/span&gt; lib/game.ex:24: Game.result/2
       &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:89: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;



  2&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;Game.play/2 when second player wins when second player chooses scissors and first player chooses paper &lt;span class="o"&gt;(&lt;/span&gt;GameTest&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:67
     &lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;CondClauseError&lt;span class="o"&gt;)&lt;/span&gt; no cond clause evaluated to a truthy value
     code: assert &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;first_player_choice, second_player_choise&lt;span class="o"&gt;)&lt;/span&gt;
     stacktrace:
       &lt;span class="o"&gt;(&lt;/span&gt;rock_paper_scissor_elixir 0.1.0&lt;span class="o"&gt;)&lt;/span&gt; lib/game.ex:24: Game.result/2
       &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:71: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

...

  3&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;Game.play/2 when second player wins when second player chooses paper and first player chooses stone &lt;span class="o"&gt;(&lt;/span&gt;GameTest&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:76
     &lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;CondClauseError&lt;span class="o"&gt;)&lt;/span&gt; no cond clause evaluated to a truthy value
     code: assert &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;first_player_choice, second_player_choise&lt;span class="o"&gt;)&lt;/span&gt;
     stacktrace:
       &lt;span class="o"&gt;(&lt;/span&gt;rock_paper_scissor_elixir 0.1.0&lt;span class="o"&gt;)&lt;/span&gt; lib/game.ex:24: Game.result/2
       &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:80: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;.&lt;/span&gt;

Finished &lt;span class="k"&gt;in &lt;/span&gt;0.05 seconds &lt;span class="o"&gt;(&lt;/span&gt;0.00s async, 0.05s &lt;span class="nb"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
9 tests, 3 failures

Randomized with seed 710365
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When the first player chooses paper and the second player chooses scissors
&lt;/h3&gt;

&lt;p&gt;We'll add the condition when the first player chooses paper and the second player chooses scissors:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# lib/game.ex&lt;/span&gt;

&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nv"&gt;@moduledoc&lt;/span&gt; &lt;span class="sd"&gt;"""
  Documentation for `Game`.
  """&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="k"&gt;cond&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="c1"&gt;# ...&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Second player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now, if we rerun the tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mix &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The test with the actual scenario passed ok. And now we have just two tests with failure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Compiling 1 file &lt;span class="o"&gt;(&lt;/span&gt;.ex&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;.&lt;/span&gt;

  1&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;Game.play/2 when second player wins when second player chooses stone and first player chooses scissors &lt;span class="o"&gt;(&lt;/span&gt;GameTest&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:85
     &lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;CondClauseError&lt;span class="o"&gt;)&lt;/span&gt; no cond clause evaluated to a truthy value
     code: assert &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;first_player_choice, second_player_choise&lt;span class="o"&gt;)&lt;/span&gt;
     stacktrace:
       &lt;span class="o"&gt;(&lt;/span&gt;rock_paper_scissor_elixir 0.1.0&lt;span class="o"&gt;)&lt;/span&gt; lib/game.ex:27: Game.result/2
       &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:89: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

.....

  2&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;Game.play/2 when second player wins when second player chooses paper and first player chooses stone &lt;span class="o"&gt;(&lt;/span&gt;GameTest&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:76
     &lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;CondClauseError&lt;span class="o"&gt;)&lt;/span&gt; no cond clause evaluated to a truthy value
     code: assert &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;first_player_choice, second_player_choise&lt;span class="o"&gt;)&lt;/span&gt;
     stacktrace:
       &lt;span class="o"&gt;(&lt;/span&gt;rock_paper_scissor_elixir 0.1.0&lt;span class="o"&gt;)&lt;/span&gt; lib/game.ex:27: Game.result/2
       &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:80: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;.&lt;/span&gt;

Finished &lt;span class="k"&gt;in &lt;/span&gt;0.04 seconds &lt;span class="o"&gt;(&lt;/span&gt;0.00s async, 0.04s &lt;span class="nb"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
9 tests, 2 failures

Randomized with seed 862104
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When  the first player chooses stone and the second player chooses paper
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;We'll add the condition when the first player chooses stone and the second player chooses paper:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# lib/game.ex&lt;/span&gt;

&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nv"&gt;@moduledoc&lt;/span&gt; &lt;span class="sd"&gt;"""
  Documentation for `Game`.
  """&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="k"&gt;cond&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="c1"&gt;# ...&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Second player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Second player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now, if we rerun the tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mix &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The test with the actual scenario passed ok. And now we have just one tests with failure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Compiling 1 file &lt;span class="o"&gt;(&lt;/span&gt;.ex&lt;span class="o"&gt;)&lt;/span&gt;


  1&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;Game.play/2 when second player wins when second player chooses stone and first player chooses scissors &lt;span class="o"&gt;(&lt;/span&gt;GameTest&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:85
     &lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;CondClauseError&lt;span class="o"&gt;)&lt;/span&gt; no cond clause evaluated to a truthy value
     code: assert &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;first_player_choice, second_player_choise&lt;span class="o"&gt;)&lt;/span&gt;
     stacktrace:
       &lt;span class="o"&gt;(&lt;/span&gt;rock_paper_scissor_elixir 0.1.0&lt;span class="o"&gt;)&lt;/span&gt; lib/game.ex:30: Game.result/2
       &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:89: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

........

Finished &lt;span class="k"&gt;in &lt;/span&gt;0.04 seconds &lt;span class="o"&gt;(&lt;/span&gt;0.00s async, 0.04s &lt;span class="nb"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
9 tests, 1 failure

Randomized with seed 980583
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When first player chooses scissors and the the second player chooses stone
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;We'll add the condition when the first player chooses scissors and the second player chooses stone:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# lib/game.ex&lt;/span&gt;

&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nv"&gt;@moduledoc&lt;/span&gt; &lt;span class="sd"&gt;"""
  Documentation for `Game`.
  """&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="k"&gt;cond&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="c1"&gt;# ...&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Second player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Second player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Second player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now, if we rerun the tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mix &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All the tests pass with success.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Compiling 1 file &lt;span class="o"&gt;(&lt;/span&gt;.ex&lt;span class="o"&gt;)&lt;/span&gt;
......

Finished &lt;span class="k"&gt;in &lt;/span&gt;0.03 seconds &lt;span class="o"&gt;(&lt;/span&gt;0.00s async, 0.03s &lt;span class="nb"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
6 tests, 0 failures

Randomized with seed 795123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the next post (soon), we'll &lt;strong&gt;refactor and improve our module Game.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Contacts
&lt;/h4&gt;

&lt;p&gt;Email: &lt;a href="mailto:contato@diegonovais.com.br"&gt;contato@diegonovais.com.br&lt;/a&gt;&lt;br&gt;
Linkedin: &lt;a href="https://www.linkedin.com/in/diegonovais/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/diegonovais/&lt;/a&gt;&lt;br&gt;
Twitter: &lt;a href="https://twitter.com/diegonovaistech" rel="noopener noreferrer"&gt;https://twitter.com/diegonovaistech&lt;/a&gt;&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>algorithms</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Building the tests when the second player wins</title>
      <dc:creator>Diego Novais</dc:creator>
      <pubDate>Wed, 31 Aug 2022 15:34:56 +0000</pubDate>
      <link>https://forem.com/dnovais/building-the-tests-when-the-second-player-wins-4a5a</link>
      <guid>https://forem.com/dnovais/building-the-tests-when-the-second-player-wins-4a5a</guid>
      <description>&lt;p&gt;The second player wins when his item chosen is the most powerful.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When the second player chooses &lt;strong&gt;scissors&lt;/strong&gt; and the first player chooses the &lt;strong&gt;paper&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;GameTest&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;ExUnit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Case&lt;/span&gt;

  &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

  &lt;span class="c1"&gt;# ...&lt;/span&gt;

  &lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s2"&gt;"Game.play/2 when second player wins"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"when second player chooses scissor and first player chooses paper"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt;
      &lt;span class="n"&gt;second_player_choise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"Second player win!!!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;When the second player chooses &lt;strong&gt;paper&lt;/strong&gt; and the first player chooses the &lt;strong&gt;stone&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;GameTest&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;ExUnit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Case&lt;/span&gt;

  &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

  &lt;span class="c1"&gt;# ...&lt;/span&gt;

  &lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s2"&gt;"Game.play/2 when second player wins"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;

    &lt;span class="c1"&gt;#...&lt;/span&gt;

    &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"when second player chooses paper and first player chooses stone"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt;
      &lt;span class="n"&gt;second_player_choise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"Second player win!!!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;When the second player chooses &lt;strong&gt;stone&lt;/strong&gt; and the first player chooses the &lt;strong&gt;scissor&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;GameTest&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;ExUnit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Case&lt;/span&gt;

  &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

  &lt;span class="c1"&gt;# ...&lt;/span&gt;

  &lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s2"&gt;"Game.play/2 when second player wins"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;

    &lt;span class="c1"&gt;#...&lt;/span&gt;

    &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"when second player chooses stone and first player chooses scissor"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt;
      &lt;span class="n"&gt;second_player_choise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"Second player win!!!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Let's look at the code of the tests when the game's result is &lt;code&gt;"Second player win!!!"&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;GameTest&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;ExUnit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Case&lt;/span&gt;

  &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

&lt;span class="c1"&gt;# ...&lt;/span&gt;

  &lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s2"&gt;"Game.play/2 when second player wins"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"when second player chooses scissors and first player chooses paper"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt;
      &lt;span class="n"&gt;second_player_choise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"Second player win!!!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"when second player chooses paper and first player chooses stone"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt;
      &lt;span class="n"&gt;second_player_choise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"Second player win!!!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"when second player chooses stone and first player chooses scissors"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt;
      &lt;span class="n"&gt;second_player_choise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"Second player win!!!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the next post (soon), we'll code our module Game following the tests when the Second Player wins.&lt;/p&gt;

&lt;h4&gt;
  
  
  Contacts
&lt;/h4&gt;

&lt;p&gt;Email: &lt;a href="mailto:contato@diegonovais.com.br"&gt;contato@diegonovais.com.br&lt;/a&gt;&lt;br&gt;
Linkedin: &lt;a href="https://www.linkedin.com/in/diegonovais/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/diegonovais/&lt;/a&gt;&lt;br&gt;
Twitter: &lt;a href="https://twitter.com/diegonovaistech" rel="noopener noreferrer"&gt;https://twitter.com/diegonovaistech&lt;/a&gt;&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>algorithms</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>First player wins! Building the code and make the tests pass</title>
      <dc:creator>Diego Novais</dc:creator>
      <pubDate>Wed, 31 Aug 2022 15:29:09 +0000</pubDate>
      <link>https://forem.com/dnovais/first-player-wins-building-the-code-and-make-the-tests-pass-38if</link>
      <guid>https://forem.com/dnovais/first-player-wins-building-the-code-and-make-the-tests-pass-38if</guid>
      <description>&lt;p&gt;Now we'll continue to code our module Game following the tests. But this time, covering the scenario when the &lt;strong&gt;first player wins&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Our Game module looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# lib/game.ex&lt;/span&gt;

&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nv"&gt;@moduledoc&lt;/span&gt; &lt;span class="sd"&gt;"""
  Documentation for `Game`.
  """&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="k"&gt;cond&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Draw!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;With our tests done, if we run the tests now:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;mix&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;We'll see the tests failures:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  1&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;Game.play/2 when first player wins when first player chooses scissors and second player chooses paper &lt;span class="o"&gt;(&lt;/span&gt;GameTest&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:38
     &lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;CondClauseError&lt;span class="o"&gt;)&lt;/span&gt; no cond clause evaluated to a truthy value
     code: assert &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;first_player_choice, second_player_choise&lt;span class="o"&gt;)&lt;/span&gt;
     stacktrace:
       &lt;span class="o"&gt;(&lt;/span&gt;rock_paper_scissor_elixir 0.1.0&lt;span class="o"&gt;)&lt;/span&gt; lib/game.ex:12: Game.result/2
       &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:42: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;


  2&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;Game.play/2 when first player wins when first player chooses stone and second player chooses scissors &lt;span class="o"&gt;(&lt;/span&gt;GameTest&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:56
     &lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;CondClauseError&lt;span class="o"&gt;)&lt;/span&gt; no cond clause evaluated to a truthy value
     code: assert &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;first_player_choice, second_player_choise&lt;span class="o"&gt;)&lt;/span&gt;
     stacktrace:
       &lt;span class="o"&gt;(&lt;/span&gt;rock_paper_scissor_elixir 0.1.0&lt;span class="o"&gt;)&lt;/span&gt; lib/game.ex:12: Game.result/2
       &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:60: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;


  3&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;Game.play/2 when first player wins when first player chooses paper and second player chooses stone &lt;span class="o"&gt;(&lt;/span&gt;GameTest&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:47
     &lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;CondClauseError&lt;span class="o"&gt;)&lt;/span&gt; no cond clause evaluated to a truthy value
     code: assert &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;first_player_choice, second_player_choise&lt;span class="o"&gt;)&lt;/span&gt;
     stacktrace:
       &lt;span class="o"&gt;(&lt;/span&gt;rock_paper_scissor_elixir 0.1.0&lt;span class="o"&gt;)&lt;/span&gt; lib/game.ex:12: Game.result/2
       &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:51: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

..

Finished &lt;span class="k"&gt;in &lt;/span&gt;0.03 seconds &lt;span class="o"&gt;(&lt;/span&gt;0.00s async, 0.03s &lt;span class="nb"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
6 tests, 3 failures
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Let's make those tests pass
&lt;/h3&gt;

&lt;p&gt;Now, we need to create some module attributes for stone, paper, and scissors:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nv"&gt;@moduledoc&lt;/span&gt; &lt;span class="sd"&gt;"""
  Documentation for `Game`.
  """&lt;/span&gt;

  &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

&lt;span class="c1"&gt;# ...&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then, we'll add the condition that guarantees that the first player is the winner according to our tests.&lt;/p&gt;

&lt;h3&gt;
  
  
  When the first player chooses scissors and the second player chooses paper
&lt;/h3&gt;

&lt;p&gt;We'll add the condition when the first player chooses scissors and the second player chooses paper:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nv"&gt;@moduledoc&lt;/span&gt; &lt;span class="sd"&gt;"""
  Documentation for `Game`.
  """&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="k"&gt;cond&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Draw!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now, if we rerun the tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mix &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The test with the actual scenario passed ok. And now we have just two tests with failure.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ps.: We have one warning message about the module attributes &lt;a class="mentioned-user" href="https://dev.to/stone"&gt;@stone&lt;/a&gt; that was set but never used.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Compiling 1 file &lt;span class="o"&gt;(&lt;/span&gt;.ex&lt;span class="o"&gt;)&lt;/span&gt;
warning: module attribute @stone was &lt;span class="nb"&gt;set &lt;/span&gt;but never used
  lib/game.ex:5

...

  1&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;Game.play/2 when first player wins when first player chooses stone and second player chooses scissors &lt;span class="o"&gt;(&lt;/span&gt;GameTest&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:56
     &lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;CondClauseError&lt;span class="o"&gt;)&lt;/span&gt; no cond clause evaluated to a truthy value
     code: assert &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;first_player_choice, second_player_choise&lt;span class="o"&gt;)&lt;/span&gt;
     stacktrace:
       &lt;span class="o"&gt;(&lt;/span&gt;rock_paper_scissor_elixir 0.1.0&lt;span class="o"&gt;)&lt;/span&gt; lib/game.ex:18: Game.result/2
       &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:60: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;.&lt;/span&gt;

  2&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;Game.play/2 when first player wins when first player chooses paper and second player chooses stone &lt;span class="o"&gt;(&lt;/span&gt;GameTest&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:47
     &lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;CondClauseError&lt;span class="o"&gt;)&lt;/span&gt; no cond clause evaluated to a truthy value
     code: assert &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;first_player_choice, second_player_choise&lt;span class="o"&gt;)&lt;/span&gt;
     stacktrace:
       &lt;span class="o"&gt;(&lt;/span&gt;rock_paper_scissor_elixir 0.1.0&lt;span class="o"&gt;)&lt;/span&gt; lib/game.ex:18: Game.result/2
       &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:51: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;



Finished &lt;span class="k"&gt;in &lt;/span&gt;0.03 seconds &lt;span class="o"&gt;(&lt;/span&gt;0.00s async, 0.03s &lt;span class="nb"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
6 tests, 2 failures

Randomized with seed 797736
...

Finished &lt;span class="k"&gt;in &lt;/span&gt;0.02 seconds &lt;span class="o"&gt;(&lt;/span&gt;0.00s async, 0.02s &lt;span class="nb"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
3 tests, 0 failures

Randomized with seed 352470
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When the first player chooses paper and the second player chooses stone
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;We'll add the condition when the first player chooses paper and the second player chooses stone:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nv"&gt;@moduledoc&lt;/span&gt; &lt;span class="sd"&gt;"""
  Documentation for `Game`.
  """&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="k"&gt;cond&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Draw!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now, if we rerun the tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mix &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The test with the actual scenario passed ok. And now we have just one tests with failure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Compiling 1 file &lt;span class="o"&gt;(&lt;/span&gt;.ex&lt;span class="o"&gt;)&lt;/span&gt;
..

  1&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;Game.play/2 when first player wins when first player chooses stone and second player chooses scissors &lt;span class="o"&gt;(&lt;/span&gt;GameTest&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:56
     &lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;CondClauseError&lt;span class="o"&gt;)&lt;/span&gt; no cond clause evaluated to a truthy value
     code: assert &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;first_player_choice, second_player_choise&lt;span class="o"&gt;)&lt;/span&gt;
     stacktrace:
       &lt;span class="o"&gt;(&lt;/span&gt;rock_paper_scissor_elixir 0.1.0&lt;span class="o"&gt;)&lt;/span&gt; lib/game.ex:21: Game.result/2
       &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:60: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

...

Finished &lt;span class="k"&gt;in &lt;/span&gt;0.03 seconds &lt;span class="o"&gt;(&lt;/span&gt;0.00s async, 0.03s &lt;span class="nb"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
6 tests, 1 failure

Randomized with seed 450094
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When the first player chooses stone and the second player chooses scissors
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;We'll add the condition when the first player chooses stone and the second player chooses scissors:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nv"&gt;@moduledoc&lt;/span&gt; &lt;span class="sd"&gt;"""
  Documentation for `Game`.
  """&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="k"&gt;cond&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Draw!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now, if we rerun the tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mix &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All the tests pass with success.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Compiling 1 file &lt;span class="o"&gt;(&lt;/span&gt;.ex&lt;span class="o"&gt;)&lt;/span&gt;
......

Finished &lt;span class="k"&gt;in &lt;/span&gt;0.03 seconds &lt;span class="o"&gt;(&lt;/span&gt;0.00s async, 0.03s &lt;span class="nb"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
6 tests, 0 failures

Randomized with seed 795123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the next post, we'll build the tests covering the scenario when the second player wins.&lt;/p&gt;

&lt;h4&gt;
  
  
  Contacts
&lt;/h4&gt;

&lt;p&gt;Email: &lt;a href="mailto:contato@diegonovais.com.br"&gt;contato@diegonovais.com.br&lt;/a&gt;&lt;br&gt;
Linkedin: &lt;a href="https://www.linkedin.com/in/diegonovais/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/diegonovais/&lt;/a&gt;&lt;br&gt;
Twitter: &lt;a href="https://twitter.com/diegonovaistech" rel="noopener noreferrer"&gt;https://twitter.com/diegonovaistech&lt;/a&gt;&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>algorithms</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Building the tests when the first player wins</title>
      <dc:creator>Diego Novais</dc:creator>
      <pubDate>Tue, 30 Aug 2022 04:12:00 +0000</pubDate>
      <link>https://forem.com/dnovais/building-the-tests-when-the-first-player-wins-1hd0</link>
      <guid>https://forem.com/dnovais/building-the-tests-when-the-first-player-wins-1hd0</guid>
      <description>&lt;p&gt;The &lt;strong&gt;first player wins&lt;/strong&gt; when his item chosen is the most powerful.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When the first player chooses &lt;strong&gt;scissors&lt;/strong&gt; and the second player chooses the &lt;strong&gt;paper&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;GameTest&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;ExUnit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Case&lt;/span&gt;

  &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

&lt;span class="c1"&gt;# ...&lt;/span&gt;

  &lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s2"&gt;"Game.play/2 when first player wins"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"when first player chooses scissor and second player chooses paper"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt;
      &lt;span class="n"&gt;second_player_choise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;When the first player chooses &lt;strong&gt;paper&lt;/strong&gt; and the second player chooses the &lt;strong&gt;stone&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;GameTest&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;ExUnit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Case&lt;/span&gt;

  &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

&lt;span class="c1"&gt;# ...&lt;/span&gt;

  &lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s2"&gt;"Game.play/2 when first player wins"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="c1"&gt;# ...&lt;/span&gt;
    &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"when first player chooses paper and second player chooses stone"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt;
      &lt;span class="n"&gt;second_player_choise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;When the first player chooses &lt;strong&gt;stone&lt;/strong&gt; and the second player chooses the &lt;strong&gt;scissor&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;GameTest&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;ExUnit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Case&lt;/span&gt;

  &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

&lt;span class="c1"&gt;# ...&lt;/span&gt;

  &lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s2"&gt;"Game.play/2 when first player wins"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="c1"&gt;# ...&lt;/span&gt;
    &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"when first player chooses stone and second player chooses scissor"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt;
      &lt;span class="n"&gt;second_player_choise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Let's look at the code of the tests when the game's result is &lt;code&gt;"First player win!!!"&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;GameTest&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;ExUnit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Case&lt;/span&gt;

  &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

&lt;span class="c1"&gt;# ...&lt;/span&gt;

  &lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s2"&gt;"Game.play/2 when first player wins"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"when first player chooses scissor and second player chooses paper"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt;
      &lt;span class="n"&gt;second_player_choise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"when first player chooses paper and second player chooses stone"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt;
      &lt;span class="n"&gt;second_player_choise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"when first player chooses stone and second player chooses scissor"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt;
      &lt;span class="n"&gt;second_player_choise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"First player win!!!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the next post, we'll code our module Game following the tests when the First Player wins.&lt;/p&gt;

&lt;h4&gt;
  
  
  Contacts
&lt;/h4&gt;

&lt;p&gt;Email: &lt;a href="mailto:contato@diegonovais.com.br"&gt;contato@diegonovais.com.br&lt;/a&gt;&lt;br&gt;
Linkedin: &lt;a href="https://www.linkedin.com/in/diegonovais/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/diegonovais/&lt;/a&gt;&lt;br&gt;
Twitter: &lt;a href="https://twitter.com/diegonovaistech" rel="noopener noreferrer"&gt;https://twitter.com/diegonovaistech&lt;/a&gt;&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>algorithms</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Game draw! Building the code and make the tests pass</title>
      <dc:creator>Diego Novais</dc:creator>
      <pubDate>Tue, 30 Aug 2022 04:07:00 +0000</pubDate>
      <link>https://forem.com/dnovais/game-draw-building-the-code-and-make-the-tests-pass-2m6j</link>
      <guid>https://forem.com/dnovais/game-draw-building-the-code-and-make-the-tests-pass-2m6j</guid>
      <description>&lt;p&gt;Now we'll code our module &lt;strong&gt;Game&lt;/strong&gt; following the tests.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# lib/game.ex&lt;/span&gt;

&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nv"&gt;@moduledoc&lt;/span&gt; &lt;span class="sd"&gt;"""
  Documentation for `Game`.
  """&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;If we run the tests now:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;mix&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;We'll see the tests failures:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  1&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;Game.play/2 when the players draw when all players choose scissor &lt;span class="o"&gt;(&lt;/span&gt;GameTest&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:27
     &lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;UndefinedFunctionError&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;function &lt;/span&gt;Game.play/2 is undefined or private
     code: assert &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;first_player_choice, second_player_choise&lt;span class="o"&gt;)&lt;/span&gt;
     stacktrace:
       &lt;span class="o"&gt;(&lt;/span&gt;rock_paper_scissor_elixir 0.1.0&lt;span class="o"&gt;)&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;3, 3&lt;span class="o"&gt;)&lt;/span&gt;
       &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:31: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;


  2&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;Game.play/2 when the players draw when all players choose paper &lt;span class="o"&gt;(&lt;/span&gt;GameTest&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:18
     &lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;UndefinedFunctionError&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;function &lt;/span&gt;Game.play/2 is undefined or private
     code: assert &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;first_player_choice, second_player_choise&lt;span class="o"&gt;)&lt;/span&gt;
     stacktrace:
       &lt;span class="o"&gt;(&lt;/span&gt;rock_paper_scissor_elixir 0.1.0&lt;span class="o"&gt;)&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;2, 2&lt;span class="o"&gt;)&lt;/span&gt;
       &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:22: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;


  3&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;Game.play/2 when the players draw when all players choose stone &lt;span class="o"&gt;(&lt;/span&gt;GameTest&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:9
     &lt;span class="k"&gt;**&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;UndefinedFunctionError&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;function &lt;/span&gt;Game.play/2 is undefined or private
     code: assert &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;first_player_choice, second_player_choise&lt;span class="o"&gt;)&lt;/span&gt;
     stacktrace:
       &lt;span class="o"&gt;(&lt;/span&gt;rock_paper_scissor_elixir 0.1.0&lt;span class="o"&gt;)&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;1, 1&lt;span class="o"&gt;)&lt;/span&gt;
       &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:13: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;



Finished &lt;span class="k"&gt;in &lt;/span&gt;0.02 seconds &lt;span class="o"&gt;(&lt;/span&gt;0.00s async, 0.02s &lt;span class="nb"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
3 tests, 3 failures
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Let's make those tests pass
&lt;/h3&gt;

&lt;p&gt;Firstly, we must create the function play passing two arguments, first_player_choice and second_player_choice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nv"&gt;@moduledoc&lt;/span&gt; &lt;span class="sd"&gt;"""
  Documentation for `Game`.
  """&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then let's rerun the tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mix &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; 1&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;Game.play/2 when the players draw when all players choose stone &lt;span class="o"&gt;(&lt;/span&gt;GameTest&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:9
     match &lt;span class="o"&gt;(=)&lt;/span&gt; failed
     code:  assert &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;first_player_choice, second_player_choise&lt;span class="o"&gt;)&lt;/span&gt;
     left:  &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt;
     right: nil
     stacktrace:
       &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:13: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;



  2&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;Game.play/2 when the players draw when all players choose scissor &lt;span class="o"&gt;(&lt;/span&gt;GameTest&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:27
     match &lt;span class="o"&gt;(=)&lt;/span&gt; failed
     code:  assert &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;first_player_choice, second_player_choise&lt;span class="o"&gt;)&lt;/span&gt;
     left:  &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt;
     right: nil
     stacktrace:
       &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:31: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;



  3&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;Game.play/2 when the players draw when all players choose paper &lt;span class="o"&gt;(&lt;/span&gt;GameTest&lt;span class="o"&gt;)&lt;/span&gt;
     &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:18
     match &lt;span class="o"&gt;(=)&lt;/span&gt; failed
     code:  assert &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Game.play&lt;span class="o"&gt;(&lt;/span&gt;first_player_choice, second_player_choise&lt;span class="o"&gt;)&lt;/span&gt;
     left:  &lt;span class="o"&gt;{&lt;/span&gt;:ok, match&lt;span class="o"&gt;}&lt;/span&gt;
     right: nil
     stacktrace:
       &lt;span class="nb"&gt;test&lt;/span&gt;/game_test.exs:22: &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;



Finished &lt;span class="k"&gt;in &lt;/span&gt;0.03 seconds &lt;span class="o"&gt;(&lt;/span&gt;0.00s async, 0.03s &lt;span class="nb"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
3 tests, 3 failures
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we need to guarantee that the game will draw if the player chooses the same item:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="nv"&gt;@moduledoc&lt;/span&gt; &lt;span class="sd"&gt;"""
  Documentation for `Game`.
  """&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="k"&gt;cond&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;second_player_choice&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"Draw!"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now, if we rerun the tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mix &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything passed, and everything was ok.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;...

Finished &lt;span class="k"&gt;in &lt;/span&gt;0.02 seconds &lt;span class="o"&gt;(&lt;/span&gt;0.00s async, 0.02s &lt;span class="nb"&gt;sync&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
3 tests, 0 failures

Randomized with seed 352470
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the next post, we'll build the tests covering the scenario when the first player wins.&lt;/p&gt;

&lt;h4&gt;
  
  
  Contacts
&lt;/h4&gt;

&lt;p&gt;Email: &lt;a href="mailto:contato@diegonovais.com.br"&gt;contato@diegonovais.com.br&lt;/a&gt;&lt;br&gt;
Linkedin: &lt;a href="https://www.linkedin.com/in/diegonovais/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/diegonovais/&lt;/a&gt;&lt;br&gt;
Twitter: &lt;a href="https://twitter.com/diegonovaistech" rel="noopener noreferrer"&gt;https://twitter.com/diegonovaistech&lt;/a&gt;&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>algorithms</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Building the tests when players draw</title>
      <dc:creator>Diego Novais</dc:creator>
      <pubDate>Tue, 30 Aug 2022 04:01:34 +0000</pubDate>
      <link>https://forem.com/dnovais/building-the-tests-when-players-draw-5h02</link>
      <guid>https://forem.com/dnovais/building-the-tests-when-players-draw-5h02</guid>
      <description>&lt;p&gt;Now we'll develop the tests, and after, we'll make the tests pass, and subsequently, we'll make some refactoring.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the tests
&lt;/h2&gt;

&lt;p&gt;Inside the module Game, we'll create the function called play, which will receive the choice of the first player and the second player as arguments.&lt;/p&gt;

&lt;p&gt;And with this data, we'll make some calculus, and then we'll know who the winner is.&lt;/p&gt;

&lt;p&gt;So, let's go to tests and scenarios...&lt;/p&gt;

&lt;h3&gt;
  
  
  When players draw
&lt;/h3&gt;

&lt;p&gt;When the first and second players choose the same item, the game is Draw!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;So, if the players choose &lt;strong&gt;stone&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;GameTest&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;ExUnit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Case&lt;/span&gt;

  &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

  &lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s2"&gt;"Game.play/2 when the players draw"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"when all players choose stone"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt;
      &lt;span class="n"&gt;second_player_choise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"Draw!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;So, if the players choose &lt;strong&gt;paper&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;GameTest&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;ExUnit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Case&lt;/span&gt;

  &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

  &lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s2"&gt;"Game.play/2 when the players draw"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="c1"&gt;#...&lt;/span&gt;

    &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"when all players choose paper"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt;
      &lt;span class="n"&gt;second_player_choise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"Draw!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;So, if the players choose &lt;strong&gt;scissor&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;GameTest&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;ExUnit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Case&lt;/span&gt;

  &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

  &lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s2"&gt;"Game.play/2 when the players draw"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="c1"&gt;#...&lt;/span&gt;
    &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"when all players choose scissor"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt;
      &lt;span class="n"&gt;second_player_choise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"Draw!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Let's look at the code of the tests when the game's result is &lt;code&gt;"Draw!"&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;GameTest&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;ExUnit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Case&lt;/span&gt;

  &lt;span class="nv"&gt;@stone&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="nv"&gt;@paper&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="nv"&gt;@scissor&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

  &lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="s2"&gt;"Game.play/2 when the players draw"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"when all players choose stone"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt;
      &lt;span class="n"&gt;second_player_choise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@stone&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"Draw!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"when all players choose paper"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt;
      &lt;span class="n"&gt;second_player_choise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@paper&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"Draw!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="s2"&gt;"when all players choose scissor"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_player_choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt;
      &lt;span class="n"&gt;second_player_choise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;@scissor&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Game&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_player_choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;second_player_choise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

      &lt;span class="n"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"Draw!"&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the next post, we'll code our module Game following the tests.&lt;/p&gt;

&lt;h4&gt;
  
  
  Contacts
&lt;/h4&gt;

&lt;p&gt;Email: &lt;a href="mailto:contato@diegonovais.com.br"&gt;contato@diegonovais.com.br&lt;/a&gt;&lt;br&gt;
Linkedin: &lt;a href="https://www.linkedin.com/in/diegonovais/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/diegonovais/&lt;/a&gt;&lt;br&gt;
Twitter: &lt;a href="https://twitter.com/diegonovaistech" rel="noopener noreferrer"&gt;https://twitter.com/diegonovaistech&lt;/a&gt;&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>algorithms</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>A List is not an Array</title>
      <dc:creator>Diego Novais</dc:creator>
      <pubDate>Fri, 26 Aug 2022 22:31:16 +0000</pubDate>
      <link>https://forem.com/dnovais/a-list-is-not-an-array-pi0</link>
      <guid>https://forem.com/dnovais/a-list-is-not-an-array-pi0</guid>
      <description>&lt;p&gt;When I saw the code below for the first time, I thought it was probably an Array. And then, it could be that you have the same thought. lol&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Creating a list&lt;/span&gt;
&lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:atom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But in Elixir, the code above it's a List.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a List?
&lt;/h2&gt;

&lt;p&gt;In a few words, a List is Linked List. But to understand better, let's remember what an array is and then talk about the List.&lt;/p&gt;

&lt;h3&gt;
  
  
  About the Array
&lt;/h3&gt;

&lt;p&gt;The Array is a data collection of the same type.&lt;/p&gt;

&lt;p&gt;In the Array, we can access the content through the indices. And when we need, for example, to get the third element of an Array directly, in Ruby, we can do by passing the index number 2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another feature of the Array is that we can iterate between the elements, one by one, directly. And in Ruby, we can do by:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="mi"&gt;4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Now, let's go back to talking about List and Elixir again
&lt;/h3&gt;

&lt;p&gt;In Elixir the lists are linked lists. That means each item is bound to the next element through the position in memory.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff1evbu79rumuecjb8d7n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff1evbu79rumuecjb8d7n.png" alt="List" width="800" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How can we iterate through the items in a List?
&lt;/h3&gt;

&lt;p&gt;Firstly we need to know that a List is composed of 2 parts: the head is the List's first item, and the tail is the rest of the items.&lt;/p&gt;

&lt;p&gt;In Elixir we have the kernel function &lt;code&gt;hd(list)&lt;/code&gt; to access the first item of the List (&lt;strong&gt;head&lt;/strong&gt;), and we also have the kernel function &lt;code&gt;tl(list)&lt;/code&gt; to access the rest of the items from the List (&lt;strong&gt;tail&lt;/strong&gt;). Take a look on the example below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;# creating the List&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:atom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:atom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;# Return the first item of the List - Head&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;hd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;# Return the rest of items of the List - Tail&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:atom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, it's possible to access the &lt;code&gt;head&lt;/code&gt; and &lt;code&gt;tail&lt;/code&gt; of a list using &lt;strong&gt;Pattern Matching&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Creating a list&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:atom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:atom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Using Pattern Matching to assign the first element &lt;/span&gt;
&lt;span class="c1"&gt;# to the head and the rest of the list to the tail.&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:atom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Return the first element from the list&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="c1"&gt;# Return the rest of elements from the list&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tail&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:atom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And to iterate each item in a list, we use recursion:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Creating the module as example&lt;/span&gt;
&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;Example&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;show_each_one&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="c1"&gt;# The kernel function IO to show the content of head&lt;/span&gt;
    &lt;span class="no"&gt;IO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Calling the function itself&lt;/span&gt;
    &lt;span class="c1"&gt;# (where the recursion happens)&lt;/span&gt;
    &lt;span class="c1"&gt;# by passing the tail as the argument of the function&lt;/span&gt;
    &lt;span class="n"&gt;show_each_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;# Creating the function using the pattern Matching&lt;/span&gt;
  &lt;span class="c1"&gt;# In the case of an empty list, it will return null (nil)&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;show_each_one&lt;/span&gt;&lt;span class="p"&gt;([]),&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# Creating a list&lt;/span&gt;
&lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:atom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:atom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;


&lt;span class="c1"&gt;# Call the function Example.show_each_one/1&lt;/span&gt;
&lt;span class="c1"&gt;# by passing the list as argument&lt;/span&gt;
&lt;span class="no"&gt;Example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show_each_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# It will return the result below:&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;atom&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="n"&gt;string&lt;/span&gt;
&lt;span class="no"&gt;nil&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We could use many other kernel functions to work with the lists:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;first(list)&lt;/code&gt; - To return the first element of the list.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;last(list)&lt;/code&gt; - To return the list element of the list.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;insert_at(list, index, value)&lt;/code&gt; - To insert one element in the list in a certain position.&lt;/li&gt;
&lt;li&gt;And many others.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need to know more about the details of the List, I suggest you look at the &lt;a href="https://hexdocs.pm/elixir/List.html" rel="noopener noreferrer"&gt;Elixir documentation about the List&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Something interesting that we need to know is that the functions we use to work with a List use recursion in their implementation.&lt;/p&gt;

&lt;p&gt;I hope that this content helps and makes sense to you! See ya!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contacts:&lt;/strong&gt;&lt;br&gt;
Email: &lt;a href="mailto:contato@diegonovais.com.br"&gt;contato@diegonovais.com.br&lt;/a&gt;&lt;br&gt;
LinkedIn: &lt;a href="https://www.linkedin.com/in/diegonovais/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/diegonovais/&lt;/a&gt;&lt;br&gt;
Github: &lt;a href="https://github.com/dnovais" rel="noopener noreferrer"&gt;https://github.com/dnovais&lt;/a&gt;&lt;br&gt;
Twitter: &lt;a href="https://twitter.com/diegonovaistech" rel="noopener noreferrer"&gt;https://twitter.com/diegonovaistech&lt;/a&gt;&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>ruby</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
