diff --git a/GildedRoseRequirements_ar.md b/GildedRoseRequirements_ar.md new file mode 100644 index 00000000..70c7a253 --- /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` ولا تتغير أبدًا. 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 @@ - + 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..af878cfc --- /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 the executable: + +``` +$ odin build src -out: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 +``` diff --git a/odin/src/core/gilded_rose.odin b/odin/src/core/gilded_rose.odin new file mode 100644 index 00000000..35ce6cfc --- /dev/null +++ b/odin/src/core/gilded_rose.odin @@ -0,0 +1,55 @@ +package gilded_rose + +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 + } + } + } + } +} 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 new file mode 100644 index 00000000..c24ff7dd --- /dev/null +++ b/odin/tests/gilded_rose_test.odin @@ -0,0 +1,11 @@ +package test_gilded_rose + +import GildedRose "../src/core" +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..9c707ffc 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 + filename_convention_scheme:standard