diff --git a/lib/music_brainz/release_search_result.ex b/lib/music_brainz/release_search_result.ex index b43d18b6..c4ea06eb 100644 --- a/lib/music_brainz/release_search_result.ex +++ b/lib/music_brainz/release_search_result.ex @@ -16,6 +16,44 @@ defmodule MusicBrainz.ReleaseSearchResult do } end + @doc """ + Returns the physical format of a release based on its media. + + Returns `:multi` when a release contains different format types. + + ## Examples + + iex> MusicBrainz.ReleaseSearchResult.format(%MusicBrainz.ReleaseSearchResult{ + ...> id: "1", title: "T", release_group: nil, artists: "A", date: "2000", barcode: "0", + ...> media: [%{format: "CD", disc_count: 1, track_count: 11}] + ...> }) + :cd + + iex> MusicBrainz.ReleaseSearchResult.format(%MusicBrainz.ReleaseSearchResult{ + ...> id: "1", title: "T", release_group: nil, artists: "A", date: "2000", barcode: "0", + ...> media: [%{format: "12\\" Vinyl", disc_count: 0, track_count: 8}] + ...> }) + :vinyl + + iex> MusicBrainz.ReleaseSearchResult.format(%MusicBrainz.ReleaseSearchResult{ + ...> id: "1", title: "T", release_group: nil, artists: "A", date: "2000", barcode: "0", + ...> media: [ + ...> %{format: "CD", disc_count: 1, track_count: 10}, + ...> %{format: "CD", disc_count: 1, track_count: 9} + ...> ] + ...> }) + :cd + + iex> MusicBrainz.ReleaseSearchResult.format(%MusicBrainz.ReleaseSearchResult{ + ...> id: "1", title: "T", release_group: nil, artists: "A", date: "2000", barcode: "0", + ...> media: [ + ...> %{format: "CD", disc_count: 0, track_count: 11}, + ...> %{format: "DVD-Video", disc_count: 0, track_count: 22} + ...> ] + ...> }) + :multi + + """ def format(release_search_result) do sorted_frequencies = release_search_result.media diff --git a/lib/music_library/country.ex b/lib/music_library/country.ex index 998787f1..de393a92 100644 --- a/lib/music_library/country.ex +++ b/lib/music_library/country.ex @@ -276,12 +276,45 @@ defmodule MusicLibrary.Country do iex> MusicLibrary.Country.to_emoji("US") "๐Ÿ‡บ๐Ÿ‡ธ" + iex> MusicLibrary.Country.to_emoji("PL") + "๐Ÿ‡ต๐Ÿ‡ฑ" + + iex> MusicLibrary.Country.to_emoji("GB") + "๐Ÿ‡ฌ๐Ÿ‡ง" + + iex> MusicLibrary.Country.to_emoji("us") + "๐Ÿ‡บ๐Ÿ‡ธ" + + iex> MusicLibrary.Country.to_emoji("pl") + "๐Ÿ‡ต๐Ÿ‡ฑ" + iex> MusicLibrary.Country.to_emoji("GB-SCT") "๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ" + iex> MusicLibrary.Country.to_emoji("GB-WLS") + "๐Ÿด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ" + + iex> MusicLibrary.Country.to_emoji("GB-ENG") + "๐Ÿด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ" + + iex> MusicLibrary.Country.to_emoji("GB-CYM") == MusicLibrary.Country.to_emoji("GB-WLS") + true + iex> MusicLibrary.Country.to_emoji("USA") "๐Ÿ‡บ๐Ÿ‡ธ" + iex> MusicLibrary.Country.to_emoji("GBR") + "๐Ÿ‡ฌ๐Ÿ‡ง" + + iex> MusicLibrary.Country.to_emoji("POL") + "๐Ÿ‡ต๐Ÿ‡ฑ" + + iex> MusicLibrary.Country.to_emoji("en-US") + "๐Ÿ‡บ๐Ÿ‡ธ" + + iex> MusicLibrary.Country.to_emoji("pl-PL") + "๐Ÿ‡ต๐Ÿ‡ฑ" + """ @spec to_emoji(String.t()) :: String.t() def to_emoji(code) when is_binary(code) do diff --git a/lib/music_library_web/duration.ex b/lib/music_library_web/duration.ex index 301c29c1..e609b0d4 100644 --- a/lib/music_library_web/duration.ex +++ b/lib/music_library_web/duration.ex @@ -1,4 +1,26 @@ defmodule MusicLibraryWeb.Duration do + @moduledoc """ + Formats durations from milliseconds to human-readable strings. + """ + + @doc """ + Formats a duration in milliseconds as a human-readable string. + + ## Examples + + iex> MusicLibraryWeb.Duration.format_duration(30_000) + "0:30" + + iex> MusicLibraryWeb.Duration.format_duration(90_000) + "1:30" + + iex> MusicLibraryWeb.Duration.format_duration(3_723_000) + "1:02:03" + + iex> MusicLibraryWeb.Duration.format_duration(0) + "0:00" + + """ def format_duration(milliseconds) do milliseconds |> System.convert_time_unit(:millisecond, :second) diff --git a/test/last_fm/session_test.exs b/test/last_fm/session_test.exs index d3cd8ec8..98f7c649 100644 --- a/test/last_fm/session_test.exs +++ b/test/last_fm/session_test.exs @@ -1,26 +1,5 @@ defmodule LastFm.SessionTest do use ExUnit.Case, async: true - alias LastFm.Session - doctest LastFm.Session - - @xml """ - - - - cloud8421 - super-secret - 1 - - - """ - - test "parse/1" do - assert %Session{ - name: "cloud8421", - key: "super-secret", - pro: true - } == Session.parse(@xml) - end end diff --git a/test/music_brainz/release_search_result_test.exs b/test/music_brainz/release_search_result_test.exs index 8f6f2e94..1792fdaf 100644 --- a/test/music_brainz/release_search_result_test.exs +++ b/test/music_brainz/release_search_result_test.exs @@ -1,79 +1,5 @@ defmodule MusicBrainz.ReleaseSearchResultTest do use ExUnit.Case, async: true - alias MusicBrainz.ReleaseSearchResult - - @single_cd %MusicBrainz.ReleaseSearchResult{ - id: "dc393148-be34-4056-be66-b2b95905c5c1", - title: "Equally Cursed and Blessed", - release_group: %{ - id: "c35fc446-65cc-3645-939b-1b3782e60639", - type: :album, - title: "Equally Cursed and Blessed" - }, - artists: "Catatonia", - date: "1999-04-12", - barcode: "639842709422", - media: [%{format: "CD", disc_count: 5, track_count: 11}] - } - - @double_cd %MusicBrainz.ReleaseSearchResult{ - id: "51ebc32b-d21f-4466-9297-94b6a3e0e6ba", - title: "Rock in Rio", - release_group: %{ - id: "ea6dac58-887a-35a8-86ff-08c56e6bf047", - type: :album, - title: "Rock in Rio" - }, - artists: "Iron Maiden", - date: "2002-03-21", - barcode: "724353864309", - media: [ - %{format: "CD", disc_count: 1, track_count: 10}, - %{format: "CD", disc_count: 1, track_count: 9} - ] - } - - @single_vinyl %MusicBrainz.ReleaseSearchResult{ - id: "3af1f610-9df1-4a48-8874-78cd64e25888", - title: "Somewhere in Time", - release_group: %{ - id: "a5fe4d2d-3aab-3e86-91ad-22a3fe16c4f2", - type: :album, - title: "Somewhere in Time" - }, - artists: "Iron Maiden", - date: "1986-09-29", - barcode: "5099924059718", - media: [%{format: "12\" Vinyl", disc_count: 0, track_count: 8}] - } - - @multi %MusicBrainz.ReleaseSearchResult{ - id: "804e4781-bc17-496e-8abd-d61c7173391c", - title: "Live With the Plovdiv Psychotic Symphony", - release_group: %{ - id: "887898c3-ef40-4162-88d3-1fbc58ee2d09", - type: :album, - title: "Live With the Plovdiv Psychotic Symphony" - }, - artists: "Sons of Apollo, ะŸะปะพะฒะดะธะฒัะบะฐ ั„ะธะปั…ะฐั€ะผะพะฝะธั", - date: "2019-08-30", - barcode: "190759669228", - media: [ - %{format: "CD", disc_count: 0, track_count: 11}, - %{format: "CD", disc_count: 1, track_count: 10}, - %{format: "CD", disc_count: 0, track_count: 3}, - %{format: "DVD-Video", disc_count: 0, track_count: 22}, - %{format: "Blu-ray", disc_count: 0, track_count: 42} - ] - } - - describe "format/1" do - test "it returns the format of the release" do - assert ReleaseSearchResult.format(@single_cd) == :cd - assert ReleaseSearchResult.format(@single_vinyl) == :vinyl - assert ReleaseSearchResult.format(@double_cd) == :cd - assert ReleaseSearchResult.format(@multi) == :multi - end - end + doctest MusicBrainz.ReleaseSearchResult end diff --git a/test/music_library/country_test.exs b/test/music_library/country_test.exs index bb1d82d7..f08d1094 100644 --- a/test/music_library/country_test.exs +++ b/test/music_library/country_test.exs @@ -1,39 +1,5 @@ defmodule MusicLibrary.CountryTest do use ExUnit.Case, async: true - alias MusicLibrary.Country - - describe "to_emoji/1" do - test "converts alpha-2 codes" do - assert Country.to_emoji("US") == "๐Ÿ‡บ๐Ÿ‡ธ" - assert Country.to_emoji("PL") == "๐Ÿ‡ต๐Ÿ‡ฑ" - assert Country.to_emoji("GB") == "๐Ÿ‡ฌ๐Ÿ‡ง" - end - - test "is case insensitive" do - assert Country.to_emoji("us") == "๐Ÿ‡บ๐Ÿ‡ธ" - assert Country.to_emoji("pl") == "๐Ÿ‡ต๐Ÿ‡ฑ" - end - - test "converts subdivision codes" do - assert Country.to_emoji("GB-SCT") == "๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ" - assert Country.to_emoji("GB-WLS") == "๐Ÿด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ" - assert Country.to_emoji("GB-ENG") == "๐Ÿด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ" - end - - test "maps GB-CYM to GB-WLS" do - assert Country.to_emoji("GB-CYM") == Country.to_emoji("GB-WLS") - end - - test "converts alpha-3 codes" do - assert Country.to_emoji("USA") == "๐Ÿ‡บ๐Ÿ‡ธ" - assert Country.to_emoji("GBR") == "๐Ÿ‡ฌ๐Ÿ‡ง" - assert Country.to_emoji("POL") == "๐Ÿ‡ต๐Ÿ‡ฑ" - end - - test "converts IETF language tags" do - assert Country.to_emoji("en-US") == "๐Ÿ‡บ๐Ÿ‡ธ" - assert Country.to_emoji("pl-PL") == "๐Ÿ‡ต๐Ÿ‡ฑ" - end - end + doctest MusicLibrary.Country end diff --git a/test/music_library_web/duration_test.exs b/test/music_library_web/duration_test.exs new file mode 100644 index 00000000..0abd3aaa --- /dev/null +++ b/test/music_library_web/duration_test.exs @@ -0,0 +1,5 @@ +defmodule MusicLibraryWeb.DurationTest do + use ExUnit.Case, async: true + + doctest MusicLibraryWeb.Duration +end