From c37c473e518f0bdff66736a4384ab0da39c44ac1 Mon Sep 17 00:00:00 2001 From: Brian Hicks Date: Mon, 5 Apr 2021 11:13:56 -0500 Subject: [PATCH] add an ID field to Player --- elm.json | 1 + src/Player.elm | 20 +++++++++++++++----- tests/PlayerTest.elm | 23 ++++++++++++++++++++++- 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/elm.json b/elm.json index 5e6f620..cc084cc 100644 --- a/elm.json +++ b/elm.json @@ -14,6 +14,7 @@ "elm/json": "1.1.3", "elm/random": "1.0.0", "ohanhi/keyboard": "2.0.1", + "robinheghan/murmur3": "1.0.0", "rtfeldman/elm-css": "16.1.0", "tesk9/accessible-html-with-css": "2.1.1" }, diff --git a/src/Player.elm b/src/Player.elm index 54ace6e..de63355 100644 --- a/src/Player.elm +++ b/src/Player.elm @@ -3,10 +3,12 @@ module Player exposing (Player, decoder, encode, incrementMatchesPlayed, init, s import Elo import Json.Decode as Decode exposing (Decoder) import Json.Encode as Encode exposing (Value) +import Murmur3 type alias Player = - { name : String + { id : Int + , name : String , rating : Int , matches : Int } @@ -14,7 +16,8 @@ type alias Player = init : String -> Player init name = - { name = name + { id = Murmur3.hashString 0 name + , name = name , rating = Elo.initialRating , matches = 0 } @@ -32,16 +35,23 @@ incrementMatchesPlayed player = decoder : Decoder Player decoder = - Decode.map3 Player + Decode.map4 Player + (Decode.oneOf + [ Decode.field "id" Decode.int + , Decode.field "name" Decode.string + |> Decode.map (Murmur3.hashString 0) + ] + ) (Decode.field "name" Decode.string) (Decode.field "rating" Decode.int) (Decode.field "matches" Decode.int) encode : Player -> Value -encode { name, rating, matches } = +encode { id, name, rating, matches } = Encode.object - [ ( "name", Encode.string name ) + [ ( "id", Encode.int id ) + , ( "name", Encode.string name ) , ( "rating", Encode.int rating ) , ( "matches", Encode.int matches ) ] diff --git a/tests/PlayerTest.elm b/tests/PlayerTest.elm index 40a37f9..0b6fb80 100644 --- a/tests/PlayerTest.elm +++ b/tests/PlayerTest.elm @@ -3,6 +3,8 @@ module PlayerTest exposing (..) import Expect import Fuzz exposing (Fuzzer) import Json.Decode as Decode +import Json.Encode as Encode +import Murmur3 import Player exposing (Player) import Test exposing (..) @@ -18,7 +20,8 @@ roundTripDecoderTest = playerFuzzer : Fuzzer Player playerFuzzer = - Fuzz.map3 Player + Fuzz.map4 Player + (Fuzz.map (Murmur3.hashString 0) nameFuzzer) nameFuzzer (Fuzz.intRange 1000 3000) (Fuzz.intRange 0 50) @@ -33,3 +36,21 @@ nameFuzzer = in Fuzz.map2 (::) chars (Fuzz.list chars) |> Fuzz.map String.fromList + + +decoderTest : Test +decoderTest = + describe "decoder" + [ describe "id" + [ test "fills in the ID if it's missing" <| + \_ -> + Encode.object + [ ( "name", Encode.string "Test" ) + , ( "rating", Encode.int 1200 ) + , ( "matches", Encode.int 0 ) + ] + |> Decode.decodeValue Player.decoder + |> Result.map .id + |> Expect.equal (Ok 123038886) + ] + ]