From b27409e72e7377bfcd9adaf7376cf7505ae434fe Mon Sep 17 00:00:00 2001 From: Younes Charfaoui Date: Mon, 28 Apr 2025 16:24:22 +0100 Subject: [PATCH 1/5] Adding arabic translation for the requirments --- GildedRoseRequirements_ar.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 GildedRoseRequirements_ar.md diff --git a/GildedRoseRequirements_ar.md b/GildedRoseRequirements_ar.md new file mode 100644 index 00000000..08e1f39e --- /dev/null +++ b/GildedRoseRequirements_ar.md @@ -0,0 +1,30 @@ +# مواصفات متطلبات Gilded Rose + +مرحبًا بكم في فريق Gilded Rose. كما تعلمون، نحن نُدير نزلاً صغيرًا بموقع مميز في مدينة بارزة يديره صاحب نزل ودود يُدعى Allison. نحن نشتري ونبيع فقط أرقى البضائع. +لسوء الحظ، بضائعنا تتدهور في (Quality) القيمة مع اقتراب تاريخ بيعها. + +لدينا نظام يقوم بتحديث المخزون لدينا. تم تطويره بواسطة شخص عملي يُدعى Leeroy، الذي انتقل الآن إلى مغامرات جديدة. +مهمتك هي إضافة ميزة جديدة إلى نظامنا لكي نبدأ ببيع فئة جديدة من العناصر. أولاً، مقدمة عن نظامنا: + +- جميع (Items) العناصر لها قيمة (SellIn) تاريخ البيع، والذي يشير إلى عدد الأيام المتبقية لبيع (Items) العناصر. +- جميع (Items) العناصر لها قيمة (Quality) القيمة، والتي تدل على مدى قيمة العنصر. +- في نهاية كل يوم، يقوم نظامنا بتقليل القيمتين لكل عنصر. + +بسيط، أليس كذلك؟ حسنًا، هنا تصبح الأمور مثيرة: + +- بمجرد أن يمر تاريخ البيع، تتدهور (Quality) القيمة بمعدل مضاعف. +- لا يمكن أن تكون قيمة (Quality) القيمة سالبة أبدًا. +- __"Aged Brie"__ تزداد (Quality) القيمة الخاصة به مع تقدم عمره. +- لا يمكن أن تتجاوز قيمة (Quality) القيمة أكثر من `50`. +- __"Sulfuras"__، كونه عنصرًا أسطوريًا، لا يحتاج أبدًا إلى البيع ولا تتناقص (Quality) القيمة الخاصة به. +- __"Backstage passes"__، مثل Aged Brie، تزداد (Quality) القيمة الخاصة به مع اقتراب موعد البيع: + - تزداد (Quality) القيمة بمقدار `2` عندما يتبقى `10` أيام أو أقل، وبمقدار `3` عندما يتبقى `5` أيام أو أقل. + - ولكن، تنخفض (Quality) القيمة إلى `0` بعد انتهاء الحفل. + +لقد وقعنا مؤخرًا عقدًا مع مورد لعناصر __"Conjured"__. هذا يتطلب تحديثًا لنظامنا: + +- عناصر __"Conjured"__ تتدهور (Quality) القيمة الخاصة بها بمعدل أسرع مرتين من العناصر العادية. + +يمكنك إجراء أي تغييرات على طريقة `UpdateQuality` وإضافة أي كود جديد طالما أن كل شيء لا يزال يعمل بشكل صحيح. ومع ذلك، لا تقم بتعديل فئة `Item` أو خاصية (Items) العناصر، لأن الغول الجالس في الزاوية سيغضب بشدة وقد يقضي عليك في لحظة، فهو لا يؤمن بمشاركة ملكية الكود (يمكنك جعل `UpdateQuality` و (Items) العناصر ساكنين static إذا أردت، وسنتكفل نحن بالتغطية عليك). + +للتوضيح فقط، لا يمكن لقيمة (Quality) القيمة لأي عنصر أن تزيد عن `50`، باستثناء __"Sulfuras"__، حيث أن (Quality) القيمة الخاصة به تساوي `80` ولا تتغير أبدًا. From 97d98be1f4e575021196d073a998f254a960bea5 Mon Sep 17 00:00:00 2001 From: Younes Charfaoui Date: Mon, 28 Apr 2025 16:31:46 +0100 Subject: [PATCH 2/5] Update GildedRoseRequirements_ar.md --- GildedRoseRequirements_ar.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/GildedRoseRequirements_ar.md b/GildedRoseRequirements_ar.md index 08e1f39e..70c7a253 100644 --- a/GildedRoseRequirements_ar.md +++ b/GildedRoseRequirements_ar.md @@ -7,15 +7,15 @@ مهمتك هي إضافة ميزة جديدة إلى نظامنا لكي نبدأ ببيع فئة جديدة من العناصر. أولاً، مقدمة عن نظامنا: - جميع (Items) العناصر لها قيمة (SellIn) تاريخ البيع، والذي يشير إلى عدد الأيام المتبقية لبيع (Items) العناصر. -- جميع (Items) العناصر لها قيمة (Quality) القيمة، والتي تدل على مدى قيمة العنصر. +- جميع (Items) العناصر لها (Quality) القيمة، والتي تدل على مدى قيمة العنصر. - في نهاية كل يوم، يقوم نظامنا بتقليل القيمتين لكل عنصر. بسيط، أليس كذلك؟ حسنًا، هنا تصبح الأمور مثيرة: - بمجرد أن يمر تاريخ البيع، تتدهور (Quality) القيمة بمعدل مضاعف. -- لا يمكن أن تكون قيمة (Quality) القيمة سالبة أبدًا. +- لا يمكن أن تكون قيمة (Quality) سالبة أبدًا. - __"Aged Brie"__ تزداد (Quality) القيمة الخاصة به مع تقدم عمره. -- لا يمكن أن تتجاوز قيمة (Quality) القيمة أكثر من `50`. +- لا يمكن أن تتجاوز (Quality) القيمة أكثر من `50`. - __"Sulfuras"__، كونه عنصرًا أسطوريًا، لا يحتاج أبدًا إلى البيع ولا تتناقص (Quality) القيمة الخاصة به. - __"Backstage passes"__، مثل Aged Brie، تزداد (Quality) القيمة الخاصة به مع اقتراب موعد البيع: - تزداد (Quality) القيمة بمقدار `2` عندما يتبقى `10` أيام أو أقل، وبمقدار `3` عندما يتبقى `5` أيام أو أقل. @@ -25,6 +25,6 @@ - عناصر __"Conjured"__ تتدهور (Quality) القيمة الخاصة بها بمعدل أسرع مرتين من العناصر العادية. -يمكنك إجراء أي تغييرات على طريقة `UpdateQuality` وإضافة أي كود جديد طالما أن كل شيء لا يزال يعمل بشكل صحيح. ومع ذلك، لا تقم بتعديل فئة `Item` أو خاصية (Items) العناصر، لأن الغول الجالس في الزاوية سيغضب بشدة وقد يقضي عليك في لحظة، فهو لا يؤمن بمشاركة ملكية الكود (يمكنك جعل `UpdateQuality` و (Items) العناصر ساكنين static إذا أردت، وسنتكفل نحن بالتغطية عليك). +يمكنك إجراء أي تغييرات على دالة `UpdateQuality` وإضافة أي كود جديد طالما أن كل شيء لا يزال يعمل بشكل صحيح. ومع ذلك، لا تقم بتعديل فئة `Item` أو خاصية (Items) العناصر، لأن الغول الجالس في الزاوية سيغضب بشدة وقد يقضي عليك في لحظة، فهو لا يؤمن بمشاركة ملكية الكود (يمكنك جعل `UpdateQuality` و (Items) العناصر ساكنين static إذا أردت، وسنتكفل نحن بالتغطية عليك). -للتوضيح فقط، لا يمكن لقيمة (Quality) القيمة لأي عنصر أن تزيد عن `50`، باستثناء __"Sulfuras"__، حيث أن (Quality) القيمة الخاصة به تساوي `80` ولا تتغير أبدًا. +للتوضيح فقط، لا يمكن لـ (Quality) القيمة لأي عنصر أن تزيد عن `50`، باستثناء __"Sulfuras"__، حيث أن (Quality) القيمة الخاصة به تساوي `80` ولا تتغير أبدًا. From eb9b46e34d46902585ccef446e56f0a37936e509 Mon Sep 17 00:00:00 2001 From: Sasha Schwartz Date: Sat, 3 May 2025 09:48:54 -0500 Subject: [PATCH 3/5] add Odin lang --- odin/.gitignore | 3 + odin/README.md | 34 +++++++++++ odin/gilded_rose/main.odin | 98 ++++++++++++++++++++++++++++++++ odin/tests/gilded_rose_test.odin | 11 ++++ texttests/config.gr | 3 + 5 files changed, 149 insertions(+) create mode 100644 odin/.gitignore create mode 100644 odin/README.md create mode 100644 odin/gilded_rose/main.odin create mode 100644 odin/tests/gilded_rose_test.odin diff --git a/odin/.gitignore b/odin/.gitignore new file mode 100644 index 00000000..2f0031b3 --- /dev/null +++ b/odin/.gitignore @@ -0,0 +1,3 @@ +*.o +*.bin +*.exe diff --git a/odin/README.md b/odin/README.md new file mode 100644 index 00000000..92e596ec --- /dev/null +++ b/odin/README.md @@ -0,0 +1,34 @@ +# Gilded Rose starting position in Odin + +Learn how to install Odin on your system [here](https://odin-lang.org/docs/install/) + +## Run unit tests from the command line +``` +$ odin test tests +``` +## Run the TextTest fixture on the command line +Build and install the executable + +``` +$ odin build gilded_rose +``` + +Execute it on the command line with an argument for the number of days: + +### macOS: + +``` +$ ./gilded_rose.bin 10 +``` +### Windows: + +``` +$ ./gilded_rose.exe 10 +``` + +## Run the TextTest approval test that comes with this project +There are instructions in the TextTest Readme for setting up TextTest. You will need to specify the executable in `config.gr`. Uncomment this line to use it: + +``` +#executable:${TEXTTEST_HOME}/odin/gilded_rose(include your OS executable extension here) +``` diff --git a/odin/gilded_rose/main.odin b/odin/gilded_rose/main.odin new file mode 100644 index 00000000..cd603525 --- /dev/null +++ b/odin/gilded_rose/main.odin @@ -0,0 +1,98 @@ +package gilded_rose + +import "core:fmt" +import "core:os" +import "core:strconv" + +Item :: struct { + name: string, + sell_in: i32, + quality: i32, +} + +update_quality :: proc(inventory: []Item) { + for &item in inventory { + if item.name != "Aged Brie" && item.name != "Backstage passes to a TAFKAL80ETC concert" { + if item.quality > 0 { + if item.name != "Sulfuras, Hand of Ragnaros" { + item.quality = item.quality - 1 + } + } + } else { + if item.quality < 50 { + item.quality = item.quality + 1 + if item.name == "Backstage passes to a TAFKAL80ETC concert" { + if item.sell_in < 11 { + if item.quality < 50 { + item.quality = item.quality + 1 + } + } + if item.sell_in < 6 { + if item.quality < 50 { + item.quality = item.quality + 1 + } + } + } + } + } + if item.name != "Sulfuras, Hand of Ragnaros" { + item.sell_in = item.sell_in - 1 + } + if item.sell_in < 0 { + if item.name != "Aged Brie" { + if item.name != "Backstage passes to a TAFKAL80ETC concert" { + if item.quality > 0 { + if item.name != "Sulfuras, Hand of Ragnaros" { + item.quality = item.quality - 1 + } + } + } else { + item.quality = item.quality - item.quality + } + } else { + if item.quality < 50 { + item.quality = item.quality + 1 + } + } + } + } +} + +main :: proc() { + days := 2 + if len(os.args) >= 2 { + if val, ok := strconv.parse_int(os.args[1]); ok && val > 0 { + days = val + } else { + fmt.eprintf("Please enter a number greater than 0\n") + return + } + } + + items := []Item { + {"+5 Dexterity Vest", 10, 20}, + {"Aged Brie", 2, 0}, + {"Elixir of the Mongoose", 5, 7}, + {"Sulfuras, Hand of Ragnaros", 0, 80}, + {"Sulfuras, Hand of Ragnaros", -1, 80}, + {"Backstage passes to a TAFKAL80ETC concert", 15, 20}, + {"Backstage passes to a TAFKAL80ETC concert", 10, 49}, + {"Backstage passes to a TAFKAL80ETC concert", 5, 49}, + // This Conjured item does not work properly yet + {"Conjured Mana Cake", 3, 6}, + } + + fmt.println("OMGHAI!") + + for day in 0 ..= days { + day_line := fmt.tprint("-------- day", day, "--------") + fmt.println(day_line) + fmt.println("name, sellIn, quality") + for item in items { + item_line := fmt.tprint(item.name, item.sell_in, item.quality, sep = ", ") + fmt.println(item_line) + } + fmt.println() + update_quality(items) + } +} diff --git a/odin/tests/gilded_rose_test.odin b/odin/tests/gilded_rose_test.odin new file mode 100644 index 00000000..cdbc1e4b --- /dev/null +++ b/odin/tests/gilded_rose_test.odin @@ -0,0 +1,11 @@ +package test_gilded_rose + +import GildedRose "../gilded_rose" +import "core:testing" + +@(test) +update_quality_test :: proc(t: ^testing.T) { + items := []GildedRose.Item{{"food", 0, 0}} + GildedRose.update_quality(items) + testing.expect(t, "fixme" == items[0].name, "Fix this test") +} diff --git a/texttests/config.gr b/texttests/config.gr index b7166cd0..6972127e 100755 --- a/texttests/config.gr +++ b/texttests/config.gr @@ -64,4 +64,7 @@ interpreter:ruby # Settings for the OCaml version # executable:${TEXTTEST_HOME}/ocaml/_build/default/bin/main.exe +# Settings for the Odin version +#executable:${TEXTTEST_HOME}/odin/gilded_rose(include your OS executable extension here) + filename_convention_scheme:standard From d73f9610896869440ceff39adaca3caae42cf398 Mon Sep 17 00:00:00 2001 From: Sasha Schwartz Date: Sat, 3 May 2025 14:14:25 -0500 Subject: [PATCH 4/5] separate files based on feedback --- odin/README.md | 6 +-- .../main.odin => src/core/gilded_rose.odin} | 43 ----------------- odin/src/main.odin | 46 +++++++++++++++++++ odin/tests/gilded_rose_test.odin | 2 +- texttests/config.gr | 2 +- 5 files changed, 51 insertions(+), 48 deletions(-) rename odin/{gilded_rose/main.odin => src/core/gilded_rose.odin} (54%) create mode 100644 odin/src/main.odin diff --git a/odin/README.md b/odin/README.md index 92e596ec..af878cfc 100644 --- a/odin/README.md +++ b/odin/README.md @@ -7,10 +7,10 @@ Learn how to install Odin on your system [here](https://odin-lang.org/docs/insta $ odin test tests ``` ## Run the TextTest fixture on the command line -Build and install the executable +Build the executable: ``` -$ odin build gilded_rose +$ odin build src -out:gilded_rose ``` Execute it on the command line with an argument for the number of days: @@ -30,5 +30,5 @@ $ ./gilded_rose.exe 10 There are instructions in the TextTest Readme for setting up TextTest. You will need to specify the executable in `config.gr`. Uncomment this line to use it: ``` -#executable:${TEXTTEST_HOME}/odin/gilded_rose(include your OS executable extension here) +#executable:${TEXTTEST_HOME}/odin/gilded_rose ``` diff --git a/odin/gilded_rose/main.odin b/odin/src/core/gilded_rose.odin similarity index 54% rename from odin/gilded_rose/main.odin rename to odin/src/core/gilded_rose.odin index cd603525..35ce6cfc 100644 --- a/odin/gilded_rose/main.odin +++ b/odin/src/core/gilded_rose.odin @@ -1,9 +1,5 @@ package gilded_rose -import "core:fmt" -import "core:os" -import "core:strconv" - Item :: struct { name: string, sell_in: i32, @@ -57,42 +53,3 @@ update_quality :: proc(inventory: []Item) { } } } - -main :: proc() { - days := 2 - if len(os.args) >= 2 { - if val, ok := strconv.parse_int(os.args[1]); ok && val > 0 { - days = val - } else { - fmt.eprintf("Please enter a number greater than 0\n") - return - } - } - - items := []Item { - {"+5 Dexterity Vest", 10, 20}, - {"Aged Brie", 2, 0}, - {"Elixir of the Mongoose", 5, 7}, - {"Sulfuras, Hand of Ragnaros", 0, 80}, - {"Sulfuras, Hand of Ragnaros", -1, 80}, - {"Backstage passes to a TAFKAL80ETC concert", 15, 20}, - {"Backstage passes to a TAFKAL80ETC concert", 10, 49}, - {"Backstage passes to a TAFKAL80ETC concert", 5, 49}, - // This Conjured item does not work properly yet - {"Conjured Mana Cake", 3, 6}, - } - - fmt.println("OMGHAI!") - - for day in 0 ..= days { - day_line := fmt.tprint("-------- day", day, "--------") - fmt.println(day_line) - fmt.println("name, sellIn, quality") - for item in items { - item_line := fmt.tprint(item.name, item.sell_in, item.quality, sep = ", ") - fmt.println(item_line) - } - fmt.println() - update_quality(items) - } -} diff --git a/odin/src/main.odin b/odin/src/main.odin new file mode 100644 index 00000000..904f5b1d --- /dev/null +++ b/odin/src/main.odin @@ -0,0 +1,46 @@ +package main + +import GildedRose "./core" +import "core:fmt" +import "core:os" +import "core:slice" +import "core:strconv" + +main :: proc() { + days := 2 + if num_of_days, arg_ok := slice.get(os.args, 1); arg_ok { + if val, ok := strconv.parse_int(num_of_days); ok && val > 0 { + days = val + } else { + fmt.eprintf("Please enter a number greater than 0\n") + return + } + } + + items := []GildedRose.Item { + {"+5 Dexterity Vest", 10, 20}, + {"Aged Brie", 2, 0}, + {"Elixir of the Mongoose", 5, 7}, + {"Sulfuras, Hand of Ragnaros", 0, 80}, + {"Sulfuras, Hand of Ragnaros", -1, 80}, + {"Backstage passes to a TAFKAL80ETC concert", 15, 20}, + {"Backstage passes to a TAFKAL80ETC concert", 10, 49}, + {"Backstage passes to a TAFKAL80ETC concert", 5, 49}, + // This Conjured item does not work properly yet + {"Conjured Mana Cake", 3, 6}, + } + + fmt.println("OMGHAI!") + + for day in 0 ..= days { + day_line := fmt.tprint("-------- day", day, "--------") + fmt.println(day_line) + fmt.println("name, sellIn, quality") + for item in items { + item_line := fmt.tprint(item.name, item.sell_in, item.quality, sep = ", ") + fmt.println(item_line) + } + fmt.println() + GildedRose.update_quality(items) + } +} diff --git a/odin/tests/gilded_rose_test.odin b/odin/tests/gilded_rose_test.odin index cdbc1e4b..c24ff7dd 100644 --- a/odin/tests/gilded_rose_test.odin +++ b/odin/tests/gilded_rose_test.odin @@ -1,6 +1,6 @@ package test_gilded_rose -import GildedRose "../gilded_rose" +import GildedRose "../src/core" import "core:testing" @(test) diff --git a/texttests/config.gr b/texttests/config.gr index 6972127e..9c707ffc 100755 --- a/texttests/config.gr +++ b/texttests/config.gr @@ -65,6 +65,6 @@ interpreter:ruby # executable:${TEXTTEST_HOME}/ocaml/_build/default/bin/main.exe # Settings for the Odin version -#executable:${TEXTTEST_HOME}/odin/gilded_rose(include your OS executable extension here) +#executable:${TEXTTEST_HOME}/odin/gilded_rose filename_convention_scheme:standard From 56bc90d53d6a57a2ceeac077da32bedc0e215b94 Mon Sep 17 00:00:00 2001 From: Rory Date: Fri, 9 May 2025 11:44:12 +0200 Subject: [PATCH 5/5] Fsharp updated to .NET 9 --- .../GildedRose.ApprovalTests.fsproj | 10 +++++----- .../GildedRose.UnitTests/GildedRose.UnitTests.fsproj | 12 ++++++------ fsharp-core/GildedRose/GildedRose.fsproj | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/fsharp-core/GildedRose.ApprovalTests/GildedRose.ApprovalTests.fsproj b/fsharp-core/GildedRose.ApprovalTests/GildedRose.ApprovalTests.fsproj index f26f9caa..02787bbe 100644 --- a/fsharp-core/GildedRose.ApprovalTests/GildedRose.ApprovalTests.fsproj +++ b/fsharp-core/GildedRose.ApprovalTests/GildedRose.ApprovalTests.fsproj @@ -1,7 +1,7 @@ - net6.0 + net9.0 false @@ -14,9 +14,9 @@ - - - + + + all runtime; build; native; contentfiles; analyzers @@ -27,7 +27,7 @@ - + diff --git a/fsharp-core/GildedRose.UnitTests/GildedRose.UnitTests.fsproj b/fsharp-core/GildedRose.UnitTests/GildedRose.UnitTests.fsproj index 9617805b..53f7981f 100644 --- a/fsharp-core/GildedRose.UnitTests/GildedRose.UnitTests.fsproj +++ b/fsharp-core/GildedRose.UnitTests/GildedRose.UnitTests.fsproj @@ -1,7 +1,7 @@ - net6.0 + net9.0 false @@ -11,10 +11,10 @@ - - - - + + + + all runtime; build; native; contentfiles; analyzers @@ -25,7 +25,7 @@ - + diff --git a/fsharp-core/GildedRose/GildedRose.fsproj b/fsharp-core/GildedRose/GildedRose.fsproj index f3235211..6a5e7449 100644 --- a/fsharp-core/GildedRose/GildedRose.fsproj +++ b/fsharp-core/GildedRose/GildedRose.fsproj @@ -2,7 +2,7 @@ Exe - net6.0 + net9.0 @@ -10,7 +10,7 @@ - +