diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index acf55ca7..ea216683 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,6 +19,9 @@ jobs: swi-prolog-branch: stable swi-prolog-version: latest + - name: Install packages + run: swipl pack install date_time -y + - name: Verify all exercises run: bin/verify-exercises.sh diff --git a/config.json b/config.json index b7bbf1f5..8a5d9c9f 100644 --- a/config.json +++ b/config.json @@ -518,6 +518,14 @@ "prerequisites": [], "difficulty": 1 }, + { + "slug": "meetup", + "name": "Meetup", + "uuid": "2590ef6c-3643-4d20-8f81-224d430ad3eb", + "practices": [], + "prerequisites": [], + "difficulty": 1 + }, { "slug": "robot-simulator", "name": "Robot Simulator", diff --git a/exercises/practice/meetup/.docs/hints.md b/exercises/practice/meetup/.docs/hints.md new file mode 100644 index 00000000..666f60b1 --- /dev/null +++ b/exercises/practice/meetup/.docs/hints.md @@ -0,0 +1,9 @@ +# Hints + +## General + +- Use the [date_time package][date_time_package] to make working with dates a lot easier. +- Check the [source of the date_time package][https://www.swi-prolog.org/pack/file_details/date_time/prolog/date_time.pl?show=src] for detailed information on how to use the package. + +[date_time_package]: https://www.swi-prolog.org/pack/list?p=date_time +[date_time-package-source]: https://www.swi-prolog.org/pack/file_details/date_time/prolog/date_time.pl?show=src \ No newline at end of file diff --git a/exercises/practice/meetup/.docs/instructions.append.md b/exercises/practice/meetup/.docs/instructions.append.md new file mode 100644 index 00000000..a0864823 --- /dev/null +++ b/exercises/practice/meetup/.docs/instructions.append.md @@ -0,0 +1,40 @@ +# Instructions append + +## Working with Dates in Prolog + +Prolog's built-in support for dates is [fairly rudimentary][built-in-dates-support]. +A much nicer way to work with dates is via the [date_time package][date_time-package]. + +### Installing the date_time package + +If your installed Swipl version is fairly up-to-date, you can install the package by running: + +```bash +swipl pack install date_time +``` + +If that doesn't work, you can run: + +```shell +swipl -g 'pack_install(date_time)' +``` + +~~~~exercism/note +If you're using the online editor, you don't need to manually install anything. +~~~~ + +### Using the date_time package + +Ad the following code to the top of your solution file to use the `date_time` package: + +```prolog +:- use_module(library(date_time)). +``` + +~~~~exercism/note +Tip: the [source of the date_time package][https://www.swi-prolog.org/pack/file_details/date_time/prolog/date_time.pl?show=src] is well documented and be a great help! +~~~~ + +[built-in-dates-support]: https://www.swi-prolog.org/pldoc/man?section=timedate +[date_time_package]: https://www.swi-prolog.org/pack/list?p=date_time +[date_time-package-source]: https://www.swi-prolog.org/pack/file_details/date_time/prolog/date_time.pl?show=src diff --git a/exercises/practice/meetup/.docs/instructions.md b/exercises/practice/meetup/.docs/instructions.md new file mode 100644 index 00000000..0694ef58 --- /dev/null +++ b/exercises/practice/meetup/.docs/instructions.md @@ -0,0 +1,51 @@ +# Instructions + +Recurring monthly meetups are generally scheduled on the given weekday of a given week each month. +In this exercise you will be given the recurring schedule, along with a month and year, and then asked to find the exact date of the meetup. + +For example a meetup might be scheduled on the _first Monday_ of every month. +You might then be asked to find the date that this meetup will happen in January 2018. +In other words, you need to determine the date of the first Monday of January 2018. + +Similarly, you might be asked to find: + +- the third Tuesday of August 2019 (August 20, 2019) +- the teenth Wednesday of May 2020 (May 13, 2020) +- the fourth Sunday of July 2021 (July 25, 2021) +- the last Thursday of November 2022 (November 24, 2022) + +The descriptors you are expected to process are: `first`, `second`, `third`, `fourth`, `last`, `teenth`. + +Note that descriptor `teenth` is a made-up word. + +It refers to the seven numbers that end in '-teen' in English: 13, 14, 15, 16, 17, 18, and 19. +But general descriptions of dates use ordinal numbers, e.g. the _first_ Monday, the _third_ Tuesday. + +For the numbers ending in '-teen', that becomes: + +- 13th (thirteenth) +- 14th (fourteenth) +- 15th (fifteenth) +- 16th (sixteenth) +- 17th (seventeenth) +- 18th (eighteenth) +- 19th (nineteenth) + +So there are seven numbers ending in '-teen'. +And there are also seven weekdays (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday). +Therefore, it is guaranteed that each day of the week (Monday, Tuesday, ...) will have exactly one numbered day ending with "teen" each month. + +If asked to find the teenth Saturday of August, 1953 (or, alternately the "Saturteenth" of August, 1953), we need to look at the calendar for August 1953: + +```plaintext + August 1953 +Su Mo Tu We Th Fr Sa + 1 + 2 3 4 5 6 7 8 + 9 10 11 12 13 14 15 +16 17 18 19 20 21 22 +23 24 25 26 27 28 29 +30 31 +``` + +The Saturday that has a number ending in '-teen' is August 15, 1953. diff --git a/exercises/practice/meetup/.meta/config.json b/exercises/practice/meetup/.meta/config.json new file mode 100644 index 00000000..e9954d9e --- /dev/null +++ b/exercises/practice/meetup/.meta/config.json @@ -0,0 +1,18 @@ +{ + "authors": [ + "erikschierboom" + ], + "files": { + "solution": [ + "meetup.pl" + ], + "test": [ + "meetup_tests.plt" + ], + "example": [ + ".meta/meetup.example.pl" + ] + }, + "blurb": "Calculate the date of meetups.", + "source": "Jeremy Hinegardner mentioned a Boulder meetup that happens on the Wednesteenth of every month" +} diff --git a/exercises/practice/meetup/.meta/meetup.example.pl b/exercises/practice/meetup/.meta/meetup.example.pl new file mode 100644 index 00000000..2ec4fb36 --- /dev/null +++ b/exercises/practice/meetup/.meta/meetup.example.pl @@ -0,0 +1,34 @@ +:- use_module(library(date_time)). +:- use_module(library(clpfd)). + +days_helper(Month, Date, WeekDay, Dates) :- + date_extract(Date, months(Month)), + date_add(Date, 1 days, NextDay), + days_helper(Month, NextDay, WeekDay, NextDates), + (week_day(Date, WeekDay) -> Dates = [Date|NextDates]; Dates = NextDates), !. + +days_helper(_, _, _, []). + +days(Year, Month, WeekDay, Dates) :- + date_create(Year, Month, 1, Date), + days_helper(Month, Date, WeekDay, Dates). + +nth1_day(Year, Month, WeekDay, Index, Date) :- + days(Year, Month, WeekDay, Dates), + nth1(Index, Dates, Date). + +meetup(Year, Month, first, WeekDay, Date) :- nth1_day(Year, Month, WeekDay, 1, Date), !. +meetup(Year, Month, second, WeekDay, Date) :- nth1_day(Year, Month, WeekDay, 2, Date), !. +meetup(Year, Month, third, WeekDay, Date) :- nth1_day(Year, Month, WeekDay, 3, Date), !. +meetup(Year, Month, fourth, WeekDay, Date) :- nth1_day(Year, Month, WeekDay, 4, Date), !. + +meetup(Year, Month, last, WeekDay, Date) :- + days(Year, Month, WeekDay, Dates), + last(Dates, Date), !. + +meetup(Year, Month, teenth, WeekDay, Date) :- + days(Year, Month, WeekDay, Dates), + member(Date, Dates), + date_extract(Date, days(Day)), + Day #>= 13, + !. diff --git a/exercises/practice/meetup/.meta/tests.toml b/exercises/practice/meetup/.meta/tests.toml new file mode 100644 index 00000000..1e5b84d0 --- /dev/null +++ b/exercises/practice/meetup/.meta/tests.toml @@ -0,0 +1,295 @@ +# This is an auto-generated file. +# +# Regenerating this file via `configlet sync` will: +# - Recreate every `description` key/value pair +# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications +# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion) +# - Preserve any other key/value pair +# +# As user-added comments (using the # character) will be removed when this file +# is regenerated, comments can be added via a `comment` key. + +[d7f8eadd-d4fc-46ee-8a20-e97bd3fd01c8] +description = "when teenth Monday is the 13th, the first day of the teenth week" + +[f78373d1-cd53-4a7f-9d37-e15bf8a456b4] +description = "when teenth Monday is the 19th, the last day of the teenth week" + +[8c78bea7-a116-425b-9c6b-c9898266d92a] +description = "when teenth Monday is some day in the middle of the teenth week" + +[cfef881b-9dc9-4d0b-8de4-82d0f39fc271] +description = "when teenth Tuesday is the 19th, the last day of the teenth week" + +[69048961-3b00-41f9-97ee-eb6d83a8e92b] +description = "when teenth Tuesday is some day in the middle of the teenth week" + +[d30bade8-3622-466a-b7be-587414e0caa6] +description = "when teenth Tuesday is the 13th, the first day of the teenth week" + +[8db4b58b-92f3-4687-867b-82ee1a04f851] +description = "when teenth Wednesday is some day in the middle of the teenth week" + +[6c27a2a2-28f8-487f-ae81-35d08c4664f7] +description = "when teenth Wednesday is the 13th, the first day of the teenth week" + +[008a8674-1958-45b5-b8e6-c2c9960d973a] +description = "when teenth Wednesday is the 19th, the last day of the teenth week" + +[e4abd5e3-57cb-4091-8420-d97e955c0dbd] +description = "when teenth Thursday is some day in the middle of the teenth week" + +[85da0b0f-eace-4297-a6dd-63588d5055b4] +description = "when teenth Thursday is the 13th, the first day of the teenth week" + +[ecf64f9b-8413-489b-bf6e-128045f70bcc] +description = "when teenth Thursday is the 19th, the last day of the teenth week" + +[ac4e180c-7d0a-4d3d-b05f-f564ebb584ca] +description = "when teenth Friday is the 19th, the last day of the teenth week" + +[b79101c7-83ad-4f8f-8ec8-591683296315] +description = "when teenth Friday is some day in the middle of the teenth week" + +[6ed38b9f-0072-4901-bd97-7c8b8b0ef1b8] +description = "when teenth Friday is the 13th, the first day of the teenth week" + +[dfae03ed-9610-47de-a632-655ab01e1e7c] +description = "when teenth Saturday is some day in the middle of the teenth week" + +[ec02e3e1-fc72-4a3c-872f-a53fa8ab358e] +description = "when teenth Saturday is the 13th, the first day of the teenth week" + +[d983094b-7259-4195-b84e-5d09578c89d9] +description = "when teenth Saturday is the 19th, the last day of the teenth week" + +[d84a2a2e-f745-443a-9368-30051be60c2e] +description = "when teenth Sunday is the 19th, the last day of the teenth week" + +[0e64bc53-92a3-4f61-85b2-0b7168c7ce5a] +description = "when teenth Sunday is some day in the middle of the teenth week" + +[de87652c-185e-4854-b3ae-04cf6150eead] +description = "when teenth Sunday is the 13th, the first day of the teenth week" + +[2cbfd0f5-ba3a-46da-a8cc-0fe4966d3411] +description = "when first Monday is some day in the middle of the first week" + +[a6168c7c-ed95-4bb3-8f92-c72575fc64b0] +description = "when first Monday is the 1st, the first day of the first week" + +[1bfc620f-1c54-4bbd-931f-4a1cd1036c20] +description = "when first Tuesday is the 7th, the last day of the first week" + +[12959c10-7362-4ca0-a048-50cf1c06e3e2] +description = "when first Tuesday is some day in the middle of the first week" + +[1033dc66-8d0b-48a1-90cb-270703d59d1d] +description = "when first Wednesday is some day in the middle of the first week" + +[b89185b9-2f32-46f4-a602-de20b09058f6] +description = "when first Wednesday is the 7th, the last day of the first week" + +[53aedc4d-b2c8-4dfb-abf7-a8dc9cdceed5] +description = "when first Thursday is some day in the middle of the first week" + +[b420a7e3-a94c-4226-870a-9eb3a92647f0] +description = "when first Thursday is another day in the middle of the first week" + +[61df3270-28b4-4713-bee2-566fa27302ca] +description = "when first Friday is the 1st, the first day of the first week" + +[cad33d4d-595c-412f-85cf-3874c6e07abf] +description = "when first Friday is some day in the middle of the first week" + +[a2869b52-5bba-44f0-a863-07bd1f67eadb] +description = "when first Saturday is some day in the middle of the first week" + +[3585315a-d0db-4ea1-822e-0f22e2a645f5] +description = "when first Saturday is another day in the middle of the first week" + +[c49e9bd9-8ccf-4cf2-947a-0ccd4e4f10b1] +description = "when first Sunday is some day in the middle of the first week" + +[1513328b-df53-4714-8677-df68c4f9366c] +description = "when first Sunday is the 7th, the last day of the first week" + +[49e083af-47ec-4018-b807-62ef411efed7] +description = "when second Monday is some day in the middle of the second week" + +[6cb79a73-38fe-4475-9101-9eec36cf79e5] +description = "when second Monday is the 8th, the first day of the second week" + +[4c39b594-af7e-4445-aa03-bf4f8effd9a1] +description = "when second Tuesday is the 14th, the last day of the second week" + +[41b32c34-2e39-40e3-b790-93539aaeb6dd] +description = "when second Tuesday is some day in the middle of the second week" + +[90a160c5-b5d9-4831-927f-63a78b17843d] +description = "when second Wednesday is some day in the middle of the second week" + +[23b98ce7-8dd5-41a1-9310-ef27209741cb] +description = "when second Wednesday is the 14th, the last day of the second week" + +[447f1960-27ca-4729-bc3f-f36043f43ed0] +description = "when second Thursday is some day in the middle of the second week" + +[c9aa2687-300c-4e79-86ca-077849a81bde] +description = "when second Thursday is another day in the middle of the second week" + +[a7e11ef3-6625-4134-acda-3e7195421c09] +description = "when second Friday is the 8th, the first day of the second week" + +[8b420e5f-9290-4106-b5ae-022f3e2a3e41] +description = "when second Friday is some day in the middle of the second week" + +[80631afc-fc11-4546-8b5f-c12aaeb72b4f] +description = "when second Saturday is some day in the middle of the second week" + +[e34d43ac-f470-44c2-aa5f-e97b78ecaf83] +description = "when second Saturday is another day in the middle of the second week" + +[a57d59fd-1023-47ad-b0df-a6feb21b44fc] +description = "when second Sunday is some day in the middle of the second week" + +[a829a8b0-abdd-4ad1-b66c-5560d843c91a] +description = "when second Sunday is the 14th, the last day of the second week" + +[501a8a77-6038-4fc0-b74c-33634906c29d] +description = "when third Monday is some day in the middle of the third week" + +[49e4516e-cf32-4a58-8bbc-494b7e851c92] +description = "when third Monday is the 15th, the first day of the third week" + +[4db61095-f7c7-493c-85f1-9996ad3012c7] +description = "when third Tuesday is the 21st, the last day of the third week" + +[714fc2e3-58d0-4b91-90fd-61eefd2892c0] +description = "when third Tuesday is some day in the middle of the third week" + +[b08a051a-2c80-445b-9b0e-524171a166d1] +description = "when third Wednesday is some day in the middle of the third week" + +[80bb9eff-3905-4c61-8dc9-bb03016d8ff8] +description = "when third Wednesday is the 21st, the last day of the third week" + +[fa52a299-f77f-4784-b290-ba9189fbd9c9] +description = "when third Thursday is some day in the middle of the third week" + +[f74b1bc6-cc5c-4bf1-ba69-c554a969eb38] +description = "when third Thursday is another day in the middle of the third week" + +[8900f3b0-801a-466b-a866-f42d64667abd] +description = "when third Friday is the 15th, the first day of the third week" + +[538ac405-a091-4314-9ccd-920c4e38e85e] +description = "when third Friday is some day in the middle of the third week" + +[244db35c-2716-4fa0-88ce-afd58e5cf910] +description = "when third Saturday is some day in the middle of the third week" + +[dd28544f-f8fa-4f06-9bcd-0ad46ce68e9e] +description = "when third Saturday is another day in the middle of the third week" + +[be71dcc6-00d2-4b53-a369-cbfae55b312f] +description = "when third Sunday is some day in the middle of the third week" + +[b7d2da84-4290-4ee6-a618-ee124ae78be7] +description = "when third Sunday is the 21st, the last day of the third week" + +[4276dc06-a1bd-4fc2-b6c2-625fee90bc88] +description = "when fourth Monday is some day in the middle of the fourth week" + +[ddbd7976-2deb-4250-8a38-925ac1a8e9a2] +description = "when fourth Monday is the 22nd, the first day of the fourth week" + +[eb714ef4-1656-47cc-913c-844dba4ebddd] +description = "when fourth Tuesday is the 28th, the last day of the fourth week" + +[16648435-7937-4d2d-b118-c3e38fd084bd] +description = "when fourth Tuesday is some day in the middle of the fourth week" + +[de062bdc-9484-437a-a8c5-5253c6f6785a] +description = "when fourth Wednesday is some day in the middle of the fourth week" + +[c2ce6821-169c-4832-8d37-690ef5d9514a] +description = "when fourth Wednesday is the 28th, the last day of the fourth week" + +[d462c631-2894-4391-a8e3-dbb98b7a7303] +description = "when fourth Thursday is some day in the middle of the fourth week" + +[9ff1f7b6-1b72-427d-9ee9-82b5bb08b835] +description = "when fourth Thursday is another day in the middle of the fourth week" + +[83bae8ba-1c49-49bc-b632-b7c7e1d7e35f] +description = "when fourth Friday is the 22nd, the first day of the fourth week" + +[de752d2a-a95e-48d2-835b-93363dac3710] +description = "when fourth Friday is some day in the middle of the fourth week" + +[eedd90ad-d581-45db-8312-4c6dcf9cf560] +description = "when fourth Saturday is some day in the middle of the fourth week" + +[669fedcd-912e-48c7-a0a1-228b34af91d0] +description = "when fourth Saturday is another day in the middle of the fourth week" + +[648e3849-ea49-44a5-a8a3-9f2a43b3bf1b] +description = "when fourth Sunday is some day in the middle of the fourth week" + +[f81321b3-99ab-4db6-9267-69c5da5a7823] +description = "when fourth Sunday is the 28th, the last day of the fourth week" + +[1af5e51f-5488-4548-aee8-11d7d4a730dc] +description = "last Monday in a month with four Mondays" + +[f29999f2-235e-4ec7-9dab-26f137146526] +description = "last Monday in a month with five Mondays" + +[31b097a0-508e-48ac-bf8a-f63cdcf6dc41] +description = "last Tuesday in a month with four Tuesdays" + +[8c022150-0bb5-4a1f-80f9-88b2e2abcba4] +description = "last Tuesday in another month with four Tuesdays" + +[0e762194-672a-4bdf-8a37-1e59fdacef12] +description = "last Wednesday in a month with five Wednesdays" + +[5016386a-f24e-4bd7-b439-95358f491b66] +description = "last Wednesday in a month with four Wednesdays" + +[12ead1a5-cdf9-4192-9a56-2229e93dd149] +description = "last Thursday in a month with four Thursdays" + +[7db89e11-7fbe-4e57-ae3c-0f327fbd7cc7] +description = "last Thursday in a month with five Thursdays" + +[e47a739e-b979-460d-9c8a-75c35ca2290b] +description = "last Friday in a month with five Fridays" + +[5bed5aa9-a57a-4e5d-8997-2cc796a5b0ec] +description = "last Friday in a month with four Fridays" + +[61e54cba-76f3-4772-a2b1-bf443fda2137] +description = "last Saturday in a month with four Saturdays" + +[8b6a737b-2fa9-444c-b1a2-80ce7a2ec72f] +description = "last Saturday in another month with four Saturdays" + +[0b63e682-f429-4d19-9809-4a45bd0242dc] +description = "last Sunday in a month with five Sundays" + +[5232307e-d3e3-4afc-8ba6-4084ad987c00] +description = "last Sunday in a month with four Sundays" + +[0bbd48e8-9773-4e81-8e71-b9a51711e3c5] +description = "when last Wednesday in February in a leap year is the 29th" + +[fe0936de-7eee-4a48-88dd-66c07ab1fefc] +description = "last Wednesday in December that is also the last day of the year" + +[2ccf2488-aafc-4671-a24e-2b6effe1b0e2] +description = "when last Sunday in February in a non-leap year is not the 29th" + +[00c3ce9f-cf36-4b70-90d8-92b32be6830e] +description = "when first Friday is the 7th, the last day of the first week" diff --git a/exercises/practice/meetup/meetup.pl b/exercises/practice/meetup/meetup.pl new file mode 100644 index 00000000..4e07987d --- /dev/null +++ b/exercises/practice/meetup/meetup.pl @@ -0,0 +1 @@ +meetup(Year, Month, Category, WeekDay, Date). diff --git a/exercises/practice/meetup/meetup_tests.plt b/exercises/practice/meetup/meetup_tests.plt new file mode 100644 index 00000000..84cd6ba5 --- /dev/null +++ b/exercises/practice/meetup/meetup_tests.plt @@ -0,0 +1,389 @@ +pending :- + current_prolog_flag(argv, ['--all'|_]). +pending :- + write('\nA TEST IS PENDING!\n'), + fail. + +:- begin_tests(meetup). + + test(when_first_monday_is_some_day_in_the_middle_of_the_first_week, condition(true)) :- + meetup(2013, 3, first, 'Monday', Date), + Date == date(2013, 3, 4). + + test(when_first_monday_is_the_1st_the_first_day_of_the_first_week, condition(pending)) :- + meetup(2013, 4, first, 'Monday', Date), + Date == date(2013, 4, 1). + + test(when_first_tuesday_is_the_7th_the_last_day_of_the_first_week, condition(pending)) :- + meetup(2013, 5, first, 'Tuesday', Date), + Date == date(2013, 5, 7). + + test(when_first_tuesday_is_some_day_in_the_middle_of_the_first_week, condition(pending)) :- + meetup(2013, 6, first, 'Tuesday', Date), + Date == date(2013, 6, 4). + + test(when_first_wednesday_is_some_day_in_the_middle_of_the_first_week, condition(pending)) :- + meetup(2013, 7, first, 'Wednesday', Date), + Date == date(2013, 7, 3). + + test(when_first_wednesday_is_the_7th_the_last_day_of_the_first_week, condition(pending)) :- + meetup(2013, 8, first, 'Wednesday', Date), + Date == date(2013, 8, 7). + + test(when_first_thursday_is_some_day_in_the_middle_of_the_first_week, condition(pending)) :- + meetup(2013, 9, first, 'Thursday', Date), + Date == date(2013, 9, 5). + + test(when_first_thursday_is_another_day_in_the_middle_of_the_first_week, condition(pending)) :- + meetup(2013, 10, first, 'Thursday', Date), + Date == date(2013, 10, 3). + + test(when_first_friday_is_the_1st_the_first_day_of_the_first_week, condition(pending)) :- + meetup(2013, 11, first, 'Friday', Date), + Date == date(2013, 11, 1). + + test(when_first_friday_is_some_day_in_the_middle_of_the_first_week, condition(pending)) :- + meetup(2013, 12, first, 'Friday', Date), + Date == date(2013, 12, 6). + + test(when_first_saturday_is_some_day_in_the_middle_of_the_first_week, condition(pending)) :- + meetup(2013, 1, first, 'Saturday', Date), + Date == date(2013, 1, 5). + + test(when_first_saturday_is_another_day_in_the_middle_of_the_first_week, condition(pending)) :- + meetup(2013, 2, first, 'Saturday', Date), + Date == date(2013, 2, 2). + + test(when_first_sunday_is_some_day_in_the_middle_of_the_first_week, condition(pending)) :- + meetup(2013, 3, first, 'Sunday', Date), + Date == date(2013, 3, 3). + + test(when_first_sunday_is_the_7th_the_last_day_of_the_first_week, condition(pending)) :- + meetup(2013, 4, first, 'Sunday', Date), + Date == date(2013, 4, 7). + + test(when_second_monday_is_some_day_in_the_middle_of_the_second_week, condition(pending)) :- + meetup(2013, 3, second, 'Monday', Date), + Date == date(2013, 3, 11). + + test(when_second_monday_is_the_8th_the_first_day_of_the_second_week, condition(pending)) :- + meetup(2013, 4, second, 'Monday', Date), + Date == date(2013, 4, 8). + + test(when_second_tuesday_is_the_14th_the_last_day_of_the_second_week, condition(pending)) :- + meetup(2013, 5, second, 'Tuesday', Date), + Date == date(2013, 5, 14). + + test(when_second_tuesday_is_some_day_in_the_middle_of_the_second_week, condition(pending)) :- + meetup(2013, 6, second, 'Tuesday', Date), + Date == date(2013, 6, 11). + + test(when_second_wednesday_is_some_day_in_the_middle_of_the_second_week, condition(pending)) :- + meetup(2013, 7, second, 'Wednesday', Date), + Date == date(2013, 7, 10). + + test(when_second_wednesday_is_the_14th_the_last_day_of_the_second_week, condition(pending)) :- + meetup(2013, 8, second, 'Wednesday', Date), + Date == date(2013, 8, 14). + + test(when_second_thursday_is_some_day_in_the_middle_of_the_second_week, condition(pending)) :- + meetup(2013, 9, second, 'Thursday', Date), + Date == date(2013, 9, 12). + + test(when_second_thursday_is_another_day_in_the_middle_of_the_second_week, condition(pending)) :- + meetup(2013, 10, second, 'Thursday', Date), + Date == date(2013, 10, 10). + + test(when_second_friday_is_the_8th_the_first_day_of_the_second_week, condition(pending)) :- + meetup(2013, 11, second, 'Friday', Date), + Date == date(2013, 11, 8). + + test(when_second_friday_is_some_day_in_the_middle_of_the_second_week, condition(pending)) :- + meetup(2013, 12, second, 'Friday', Date), + Date == date(2013, 12, 13). + + test(when_second_saturday_is_some_day_in_the_middle_of_the_second_week, condition(pending)) :- + meetup(2013, 1, second, 'Saturday', Date), + Date == date(2013, 1, 12). + + test(when_second_saturday_is_another_day_in_the_middle_of_the_second_week, condition(pending)) :- + meetup(2013, 2, second, 'Saturday', Date), + Date == date(2013, 2, 9). + + test(when_second_sunday_is_some_day_in_the_middle_of_the_second_week, condition(pending)) :- + meetup(2013, 3, second, 'Sunday', Date), + Date == date(2013, 3, 10). + + test(when_second_sunday_is_the_14th_the_last_day_of_the_second_week, condition(pending)) :- + meetup(2013, 4, second, 'Sunday', Date), + Date == date(2013, 4, 14). + + test(when_third_monday_is_some_day_in_the_middle_of_the_third_week, condition(pending)) :- + meetup(2013, 3, third, 'Monday', Date), + Date == date(2013, 3, 18). + + test(when_third_monday_is_the_15th_the_first_day_of_the_third_week, condition(pending)) :- + meetup(2013, 4, third, 'Monday', Date), + Date == date(2013, 4, 15). + + test(when_third_tuesday_is_the_21st_the_last_day_of_the_third_week, condition(pending)) :- + meetup(2013, 5, third, 'Tuesday', Date), + Date == date(2013, 5, 21). + + test(when_third_tuesday_is_some_day_in_the_middle_of_the_third_week, condition(pending)) :- + meetup(2013, 6, third, 'Tuesday', Date), + Date == date(2013, 6, 18). + + test(when_third_wednesday_is_some_day_in_the_middle_of_the_third_week, condition(pending)) :- + meetup(2013, 7, third, 'Wednesday', Date), + Date == date(2013, 7, 17). + + test(when_third_wednesday_is_the_21st_the_last_day_of_the_third_week, condition(pending)) :- + meetup(2013, 8, third, 'Wednesday', Date), + Date == date(2013, 8, 21). + + test(when_third_thursday_is_some_day_in_the_middle_of_the_third_week, condition(pending)) :- + meetup(2013, 9, third, 'Thursday', Date), + Date == date(2013, 9, 19). + + test(when_third_thursday_is_another_day_in_the_middle_of_the_third_week, condition(pending)) :- + meetup(2013, 10, third, 'Thursday', Date), + Date == date(2013, 10, 17). + + test(when_third_friday_is_the_15th_the_first_day_of_the_third_week, condition(pending)) :- + meetup(2013, 11, third, 'Friday', Date), + Date == date(2013, 11, 15). + + test(when_third_friday_is_some_day_in_the_middle_of_the_third_week, condition(pending)) :- + meetup(2013, 12, third, 'Friday', Date), + Date == date(2013, 12, 20). + + test(when_third_saturday_is_some_day_in_the_middle_of_the_third_week, condition(pending)) :- + meetup(2013, 1, third, 'Saturday', Date), + Date == date(2013, 1, 19). + + test(when_third_saturday_is_another_day_in_the_middle_of_the_third_week, condition(pending)) :- + meetup(2013, 2, third, 'Saturday', Date), + Date == date(2013, 2, 16). + + test(when_third_sunday_is_some_day_in_the_middle_of_the_third_week, condition(pending)) :- + meetup(2013, 3, third, 'Sunday', Date), + Date == date(2013, 3, 17). + + test(when_third_sunday_is_the_21st_the_last_day_of_the_third_week, condition(pending)) :- + meetup(2013, 4, third, 'Sunday', Date), + Date == date(2013, 4, 21). + + test(when_fourth_monday_is_some_day_in_the_middle_of_the_fourth_week, condition(pending)) :- + meetup(2013, 3, fourth, 'Monday', Date), + Date == date(2013, 3, 25). + + test(when_fourth_monday_is_the_22nd_the_first_day_of_the_fourth_week, condition(pending)) :- + meetup(2013, 4, fourth, 'Monday', Date), + Date == date(2013, 4, 22). + + test(when_fourth_tuesday_is_the_28th_the_last_day_of_the_fourth_week, condition(pending)) :- + meetup(2013, 5, fourth, 'Tuesday', Date), + Date == date(2013, 5, 28). + + test(when_fourth_tuesday_is_some_day_in_the_middle_of_the_fourth_week, condition(pending)) :- + meetup(2013, 6, fourth, 'Tuesday', Date), + Date == date(2013, 6, 25). + + test(when_fourth_wednesday_is_some_day_in_the_middle_of_the_fourth_week, condition(pending)) :- + meetup(2013, 7, fourth, 'Wednesday', Date), + Date == date(2013, 7, 24). + + test(when_fourth_wednesday_is_the_28th_the_last_day_of_the_fourth_week, condition(pending)) :- + meetup(2013, 8, fourth, 'Wednesday', Date), + Date == date(2013, 8, 28). + + test(when_fourth_thursday_is_some_day_in_the_middle_of_the_fourth_week, condition(pending)) :- + meetup(2013, 9, fourth, 'Thursday', Date), + Date == date(2013, 9, 26). + + test(when_fourth_thursday_is_another_day_in_the_middle_of_the_fourth_week, condition(pending)) :- + meetup(2013, 10, fourth, 'Thursday', Date), + Date == date(2013, 10, 24). + + test(when_fourth_friday_is_the_22nd_the_first_day_of_the_fourth_week, condition(pending)) :- + meetup(2013, 11, fourth, 'Friday', Date), + Date == date(2013, 11, 22). + + test(when_fourth_friday_is_some_day_in_the_middle_of_the_fourth_week, condition(pending)) :- + meetup(2013, 12, fourth, 'Friday', Date), + Date == date(2013, 12, 27). + + test(when_fourth_saturday_is_some_day_in_the_middle_of_the_fourth_week, condition(pending)) :- + meetup(2013, 1, fourth, 'Saturday', Date), + Date == date(2013, 1, 26). + + test(when_fourth_saturday_is_another_day_in_the_middle_of_the_fourth_week, condition(pending)) :- + meetup(2013, 2, fourth, 'Saturday', Date), + Date == date(2013, 2, 23). + + test(when_fourth_sunday_is_some_day_in_the_middle_of_the_fourth_week, condition(pending)) :- + meetup(2013, 3, fourth, 'Sunday', Date), + Date == date(2013, 3, 24). + + test(when_fourth_sunday_is_the_28th_the_last_day_of_the_fourth_week, condition(pending)) :- + meetup(2013, 4, fourth, 'Sunday', Date), + Date == date(2013, 4, 28). + + test(last_monday_in_a_month_with_four_mondays, condition(pending)) :- + meetup(2013, 3, last, 'Monday', Date), + Date == date(2013, 3, 25). + + test(last_monday_in_a_month_with_five_mondays, condition(pending)) :- + meetup(2013, 4, last, 'Monday', Date), + Date == date(2013, 4, 29). + + test(last_tuesday_in_a_month_with_four_tuesdays, condition(pending)) :- + meetup(2013, 5, last, 'Tuesday', Date), + Date == date(2013, 5, 28). + + test(last_tuesday_in_another_month_with_four_tuesdays, condition(pending)) :- + meetup(2013, 6, last, 'Tuesday', Date), + Date == date(2013, 6, 25). + + test(last_wednesday_in_a_month_with_five_wednesdays, condition(pending)) :- + meetup(2013, 7, last, 'Wednesday', Date), + Date == date(2013, 7, 31). + + test(last_wednesday_in_a_month_with_four_wednesdays, condition(pending)) :- + meetup(2013, 8, last, 'Wednesday', Date), + Date == date(2013, 8, 28). + + test(last_thursday_in_a_month_with_four_thursdays, condition(pending)) :- + meetup(2013, 9, last, 'Thursday', Date), + Date == date(2013, 9, 26). + + test(last_thursday_in_a_month_with_five_thursdays, condition(pending)) :- + meetup(2013, 10, last, 'Thursday', Date), + Date == date(2013, 10, 31). + + test(last_friday_in_a_month_with_five_fridays, condition(pending)) :- + meetup(2013, 11, last, 'Friday', Date), + Date == date(2013, 11, 29). + + test(last_friday_in_a_month_with_four_fridays, condition(pending)) :- + meetup(2013, 12, last, 'Friday', Date), + Date == date(2013, 12, 27). + + test(last_saturday_in_a_month_with_four_saturdays, condition(pending)) :- + meetup(2013, 1, last, 'Saturday', Date), + Date == date(2013, 1, 26). + + test(last_saturday_in_another_month_with_four_saturdays, condition(pending)) :- + meetup(2013, 2, last, 'Saturday', Date), + Date == date(2013, 2, 23). + + test(last_sunday_in_a_month_with_five_sundays, condition(pending)) :- + meetup(2013, 3, last, 'Sunday', Date), + Date == date(2013, 3, 31). + + test(last_sunday_in_a_month_with_four_sundays, condition(pending)) :- + meetup(2013, 4, last, 'Sunday', Date), + Date == date(2013, 4, 28). + + test(when_last_wednesday_in_february_in_a_leap_year_is_the_29th, condition(pending)) :- + meetup(2012, 2, last, 'Wednesday', Date), + Date == date(2012, 2, 29). + + test(last_wednesday_in_december_that_is_also_the_last_day_of_the_year, condition(pending)) :- + meetup(2014, 12, last, 'Wednesday', Date), + Date == date(2014, 12, 31). + + test(when_last_sunday_in_february_in_a_non_leap_year_is_not_the_29th, condition(pending)) :- + meetup(2015, 2, last, 'Sunday', Date), + Date == date(2015, 2, 22). + + test(when_first_friday_is_the_7th_the_last_day_of_the_first_week, condition(pending)) :- + meetup(2012, 12, first, 'Friday', Date), + Date == date(2012, 12, 7). + + test(when_teenth_monday_is_the_13th_the_first_day_of_the_teenth_week, condition(pending)) :- + meetup(2013, 5, teenth, 'Monday', Date), + Date == date(2013, 5, 13). + + test(when_teenth_monday_is_the_19th_the_last_day_of_the_teenth_week, condition(pending)) :- + meetup(2013, 8, teenth, 'Monday', Date), + Date == date(2013, 8, 19). + + test(when_teenth_monday_is_some_day_in_the_middle_of_the_teenth_week, condition(pending)) :- + meetup(2013, 9, teenth, 'Monday', Date), + Date == date(2013, 9, 16). + + test(when_teenth_tuesday_is_the_19th_the_last_day_of_the_teenth_week, condition(pending)) :- + meetup(2013, 3, teenth, 'Tuesday', Date), + Date == date(2013, 3, 19). + + test(when_teenth_tuesday_is_some_day_in_the_middle_of_the_teenth_week, condition(pending)) :- + meetup(2013, 4, teenth, 'Tuesday', Date), + Date == date(2013, 4, 16). + + test(when_teenth_tuesday_is_the_13th_the_first_day_of_the_teenth_week, condition(pending)) :- + meetup(2013, 8, teenth, 'Tuesday', Date), + Date == date(2013, 8, 13). + + test(when_teenth_wednesday_is_some_day_in_the_middle_of_the_teenth_week, condition(pending)) :- + meetup(2013, 1, teenth, 'Wednesday', Date), + Date == date(2013, 1, 16). + + test(when_teenth_wednesday_is_the_13th_the_first_day_of_the_teenth_week, condition(pending)) :- + meetup(2013, 2, teenth, 'Wednesday', Date), + Date == date(2013, 2, 13). + + test(when_teenth_wednesday_is_the_19th_the_last_day_of_the_teenth_week, condition(pending)) :- + meetup(2013, 6, teenth, 'Wednesday', Date), + Date == date(2013, 6, 19). + + test(when_teenth_thursday_is_some_day_in_the_middle_of_the_teenth_week, condition(pending)) :- + meetup(2013, 5, teenth, 'Thursday', Date), + Date == date(2013, 5, 16). + + test(when_teenth_thursday_is_the_13th_the_first_day_of_the_teenth_week, condition(pending)) :- + meetup(2013, 6, teenth, 'Thursday', Date), + Date == date(2013, 6, 13). + + test(when_teenth_thursday_is_the_19th_the_last_day_of_the_teenth_week, condition(pending)) :- + meetup(2013, 9, teenth, 'Thursday', Date), + Date == date(2013, 9, 19). + + test(when_teenth_friday_is_the_19th_the_last_day_of_the_teenth_week, condition(pending)) :- + meetup(2013, 4, teenth, 'Friday', Date), + Date == date(2013, 4, 19). + + test(when_teenth_friday_is_some_day_in_the_middle_of_the_teenth_week, condition(pending)) :- + meetup(2013, 8, teenth, 'Friday', Date), + Date == date(2013, 8, 16). + + test(when_teenth_friday_is_the_13th_the_first_day_of_the_teenth_week, condition(pending)) :- + meetup(2013, 9, teenth, 'Friday', Date), + Date == date(2013, 9, 13). + + test(when_teenth_saturday_is_some_day_in_the_middle_of_the_teenth_week, condition(pending)) :- + meetup(2013, 2, teenth, 'Saturday', Date), + Date == date(2013, 2, 16). + + test(when_teenth_saturday_is_the_13th_the_first_day_of_the_teenth_week, condition(pending)) :- + meetup(2013, 4, teenth, 'Saturday', Date), + Date == date(2013, 4, 13). + + test(when_teenth_saturday_is_the_19th_the_last_day_of_the_teenth_week, condition(pending)) :- + meetup(2013, 10, teenth, 'Saturday', Date), + Date == date(2013, 10, 19). + + test(when_teenth_sunday_is_the_19th_the_last_day_of_the_teenth_week, condition(pending)) :- + meetup(2013, 5, teenth, 'Sunday', Date), + Date == date(2013, 5, 19). + + test(when_teenth_sunday_is_some_day_in_the_middle_of_the_teenth_week, condition(pending)) :- + meetup(2013, 6, teenth, 'Sunday', Date), + Date == date(2013, 6, 16). + + test(when_teenth_sunday_is_the_13th_the_first_day_of_the_teenth_week, condition(pending)) :- + meetup(2013, 10, teenth, 'Sunday', Date), + Date == date(2013, 10, 13). + +:- end_tests(meetup).