From 478bfae5749874633bfa7ce871782e6132299ae1 Mon Sep 17 00:00:00 2001 From: mgd Date: Sat, 5 Oct 2024 18:15:48 +0100 Subject: [PATCH] Inital commit for elisp version of kata --- elisp/gilded-rose-test.el | 68 +++++++++++++++++++++++++++++++++++++++ elisp/gilded-rose.el | 42 ++++++++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 elisp/gilded-rose-test.el create mode 100644 elisp/gilded-rose.el diff --git a/elisp/gilded-rose-test.el b/elisp/gilded-rose-test.el new file mode 100644 index 00000000..6fd903f1 --- /dev/null +++ b/elisp/gilded-rose-test.el @@ -0,0 +1,68 @@ +(require 'ert) +(require 'gilded-rose) + +(ert-deftest test-aged-brie-increases-quality () + "Test that Aged Brie increases in quality." + (let ((item (make-item "Aged Brie" 2 0))) + (update-quality item) + (should (= (item-quality item) 1)))) + +(ert-deftest test-aged-brie-max-quality () + "Test that Aged Brie does not exceed max quality." + (let ((item (make-item "Aged Brie" 2 50))) + (update-quality item) + (should (= (item-quality item) 50)))) + +(ert-deftest test-backstage-passes-increases-quality () + "Test that Backstage passes increase in quality." + (let ((item (make-item "Backstage passes" 15 20))) + (update-quality item) + (should (= (item-quality item) 20)))) + +(ert-deftest test-backstage-passes-quality-increases-by-2 () + "Test that Backstage passes increase by 2 when sell-in is 10 or less." + (let ((item (make-item "Backstage passes" 10 20))) + (update-quality item) + (should (= (item-quality item) 22)))) + +(ert-deftest test-backstage-passes-quality-increases-by-3 () + "Test that Backstage passes increase by 3 when sell-in is 5 or less." + (let ((item (make-item "Backstage passes" 5 20))) + (update-quality item) + (should (= (item-quality item) 23)))) + +(ert-deftest test-backstage-passes-quality-drops-to-0 () + "Test that Backstage passes drop to 0 after sell-in date." + (let ((item (make-item "Backstage passes" 0 20))) + (update-quality item) + (should (= (item-quality item) 0)))) + +(ert-deftest test-normal-item-decreases-quality () + "Test that normal items decrease in quality." + (let ((item (make-item "Normal Item" 5 10))) + (update-quality item) + (should (= (item-quality item) 9)))) + +(ert-deftest test-normal-item-quality-decreases-twice-after-sell-in () + "Test that normal items decrease in quality by 2 after sell-in date." + (let ((item (make-item "Normal Item" 0 10))) + (update-quality item) + (should (= (item-quality item) 8)))) + +(ert-deftest test-sulfuras-quality-unchanged () + "Test that Sulfuras quality remains unchanged." + (let ((item (make-item "Sulfuras" 0 80))) + (update-quality item) + (should (= (item-quality item) 80)))) + +(ert-deftest test-normal-item-quality-never-negative () + "Test that normal items' quality never goes negative." + (let ((item (make-item "Normal Item" 0 0))) + (update-quality item) + (should (= (item-quality item) 0)))) + +(ert-deftest simple-test () + (should (= 1 1))) + +;; Run the tests +(ert-run-tests-interactively t) diff --git a/elisp/gilded-rose.el b/elisp/gilded-rose.el new file mode 100644 index 00000000..5722fa86 --- /dev/null +++ b/elisp/gilded-rose.el @@ -0,0 +1,42 @@ +(defun make-item (name sell-in quality) + "Create an item with NAME, SELL-IN, and QUALITY." + (list :name name :sell-in sell-in :quality quality)) + +(defun item-name (item) + "Return the name of ITEM." + (plist-get item :name)) + +(defun item-sell-in (item) + "Return the sell-in value of ITEM." + (plist-get item :sell-in)) + +(defun item-quality (item) + "Return the quality of ITEM." + (plist-get item :quality)) + +(defun update-quality (item) + "Update the quality of the ITEM according to the Gilded Rose rules." + (let ((quality (item-quality item)) + (sell-in (item-sell-in item))) + (cond + ;; Aged Brie + ((string= (item-name item) "Aged Brie") + (setf (nth 2 item) (min 50 (1+ quality)))) + + ;; Backstage passes + ((string= (item-name item) "Backstage passes") + (cond + ((> sell-in 10) (setf (nth 2 item) quality)) + ((and (<= sell-in 10) (> sell-in 5)) (setf (nth 2 item) (min 50 (+ quality 2)))) + ((and (<= sell-in 5) (> sell-in 0)) (setf (nth 2 item) (min 50 (+ quality 3)))) + (t (setf (nth 2 item) 0)))) + + ;; Sulfuras + ((string= (item-name item) "Sulfuras") + (setf (nth 2 item) quality)) ;; Sulfuras never changes + + + (defvar fork (make-item "fork" 10 10)) + (update-quality fork) + (item-quality fork) +(provide 'gilded-rose)