module FileTest exposing (suite) import Expect import File exposing (File, FileStatus(..), extendSelectionToNext, extendSelectionToPrevious, selectNext, selectPrevious, selectSimilar, withStatus) import Fixtures exposing (filteredDir1, filteredDir2, filteredDir3, filteredDir4, filteredDir5, filteredDir6, filteredDir7, filteredDir8) import Iso8601 import Json.Decode exposing (Decoder, decodeString) import Test exposing (Test, describe, test) import Time exposing (millisToPosix) suite : Test suite = describe "File module" [ test "selectNext selects the next file" <| \_ -> let actual : List File actual = selectNext [ filteredDir1 , filteredDir2 |> withStatus Selected , filteredDir3 , filteredDir4 , filteredDir5 ] expected : List File expected = [ filteredDir1 , filteredDir2 , filteredDir3 |> withStatus Selected , filteredDir4 , filteredDir5 ] in Expect.equal expected actual , test "selectNext does nothing when the currently selected file is the last" <| \_ -> let actual : List File actual = selectNext expected expected : List File expected = [ filteredDir1 , filteredDir2 , filteredDir3 , filteredDir4 , filteredDir5 |> withStatus Selected ] in Expect.equal expected actual , test "selectNext selects the last file in a list when none is selected" <| \_ -> let actual : List File actual = selectNext [ filteredDir1 , filteredDir2 , filteredDir3 , filteredDir4 , filteredDir5 ] expected : List File expected = [ filteredDir1 , filteredDir2 , filteredDir3 , filteredDir4 , filteredDir5 |> withStatus Selected ] in Expect.equal expected actual , test "selectPrevious selects the previous file in a list when there is one" <| \_ -> let actual : List File actual = selectPrevious [ filteredDir1 , filteredDir2 , filteredDir3 , filteredDir4 |> withStatus Selected , filteredDir5 ] expected : List File expected = [ filteredDir1 , filteredDir2 , filteredDir3 |> withStatus Selected , filteredDir4 , filteredDir5 ] in Expect.equal expected actual , test "selectPrevious does nothing when the currently selected file is the first" <| \_ -> let actual : List File actual = selectPrevious expected expected : List File expected = [ filteredDir1 |> withStatus Selected , filteredDir2 , filteredDir3 , filteredDir4 , filteredDir5 ] in Expect.equal expected actual , test "selectPrevious selects the first file in a list when none is selected" <| \_ -> let actual : List File actual = selectPrevious [ filteredDir1 , filteredDir2 , filteredDir3 , filteredDir4 , filteredDir5 ] expected : List File expected = [ filteredDir1 |> withStatus Selected , filteredDir2 , filteredDir3 , filteredDir4 , filteredDir5 ] in Expect.equal expected actual , test "extendSelectionToNext selects the next file after the first selected" <| \_ -> let actual : List File actual = extendSelectionToNext [ filteredDir1 , filteredDir2 |> withStatus Selected , filteredDir3 , filteredDir4 , filteredDir5 ] expected : List File expected = [ filteredDir1 , filteredDir2 |> withStatus Selected , filteredDir3 |> withStatus Selected , filteredDir4 , filteredDir5 ] in Expect.equal expected actual , test "extendSelectionToPrevious selects the file before the first selected" <| \_ -> let actual : List File actual = extendSelectionToPrevious [ filteredDir1 , filteredDir2 , filteredDir3 |> withStatus Selected , filteredDir4 , filteredDir5 ] expected : List File expected = [ filteredDir1 , filteredDir2 |> withStatus Selected , filteredDir3 |> withStatus Selected , filteredDir4 , filteredDir5 ] in Expect.equal expected actual , test "selectSimilar selects the files with a name looking like the given one" <| \_ -> let actual : List File actual = selectSimilar filteredDir6 10 [ filteredDir1 , filteredDir6 |> withStatus Selected , filteredDir2 , filteredDir7 , filteredDir3 , filteredDir8 , filteredDir4 |> withStatus Selected , filteredDir5 ] expected : List File expected = [ filteredDir1 , filteredDir6 |> withStatus Selected , filteredDir2 , filteredDir7 |> withStatus Selected , filteredDir3 , filteredDir8 |> withStatus Selected , filteredDir4 , filteredDir5 ] in Expect.equal expected actual , test "filerDecoder is able to decode a file descriptor" <| \_ -> let actual : File actual = """ { "DirPath": "/Users/pascal", "IsDir": true, "ModTime": "2025-12-16T19:43:08.307Z", "Mode": 16832, "Name": "Music", "Size": 256 } """ |> decodeString File.fileDecoder |> Result.toMaybe |> Maybe.withDefault Fixtures.dir1 expected : File expected = { parentPath = "/Users/pascal" , isDir = True , modTime = millisToPosix 1765914188307 , mode = 16832 , name = "Music" , satisfiesFilter = False , status = Unselected , size = 256 } in Expect.equal expected actual ]