{"action":"created","comment":{"url":"https://api.github.com/repos/exercism/xhaskell/pulls/comments/86704650","pull_request_review_id":7348679,"id":86704650,"diff_hunk":"@@ -17,62 +17,82 @@ specs = describe \"forth\" $ do\n \n     let runTexts = fmap toList . foldM (flip evalText) empty\n \n-    it \"no input, no stack\" $\n-      toList empty `shouldBe` []\n-\n-    it \"numbers just get pushed onto the stack\" $\n-      runTexts [\"1 2 3 4 5\"] `shouldBe` Right [1, 2, 3, 4, 5]\n-\n-    it \"non-word characters are separators\" $\n-      runTexts [\"1\\NUL2\\SOH3\\n4\\r5 6\\t7\"] `shouldBe` Right [1, 2, 3, 4, 5, 6, 7]\n-\n-    it \"basic arithmetic\" $ do\n-      runTexts [\"1 2 + 4 -\"] `shouldBe` Right [-1]\n-      runTexts [\"2 4 * 3 /\"] `shouldBe` Right [2]\n-\n-    it \"division by zero\" $\n-      runTexts [\"4 2 2 - /\"] `shouldBe` Left DivisionByZero\n-\n-    it \"dup\" $ do\n-      runTexts [\"1 DUP\"  ] `shouldBe` Right [1, 1]\n-      runTexts [\"1 2 Dup\"] `shouldBe` Right [1, 2, 2]\n-      runTexts [\"dup\"    ] `shouldBe` Left StackUnderflow\n-\n-    it \"drop\" $ do\n-      runTexts [\"1 drop\"  ] `shouldBe` Right []\n-      runTexts [\"1 2 drop\"] `shouldBe` Right [1]\n-      runTexts [\"drop\"    ] `shouldBe` Left StackUnderflow\n-\n-    it \"swap\" $ do\n-      runTexts [\"1 2 swap\"  ] `shouldBe` Right [2, 1]\n-      runTexts [\"1 2 3 swap\"] `shouldBe` Right [1, 3, 2]\n-      runTexts [\"1 swap\"    ] `shouldBe` Left StackUnderflow\n-      runTexts [\"swap\"      ] `shouldBe` Left StackUnderflow\n-\n-    it \"over\" $ do\n-      runTexts [\"1 2 over\"  ] `shouldBe` Right [1, 2, 1]\n-      runTexts [\"1 2 3 over\"] `shouldBe` Right [1, 2, 3, 2]\n-      runTexts [\"1 over\"    ] `shouldBe` Left StackUnderflow\n-      runTexts [\"over\"      ] `shouldBe` Left StackUnderflow\n-\n-    it \"defining a new word\" $\n-      runTexts [ \": dup-twice dup dup ;\"\n-               , \"1 dup-twice\"           ] `shouldBe` Right [1, 1, 1]\n-\n-    it \"redefining an existing word\" $\n-      runTexts [ \": foo dup ;\"\n-               , \": foo dup dup ;\"\n-               , \"1 foo\"           ] `shouldBe` Right [1, 1, 1]\n-\n-    it \"redefining an existing built-in word\" $\n-      runTexts [ \": swap dup ;\"\n-               , \"1 swap\"       ] `shouldBe` Right [1, 1]\n-\n-    it \"defining words with odd characters\" $\n-      runTexts [\": € 220371 ; €\"] `shouldBe` Right [220371]\n-\n-    it \"defining a number\" $\n-      runTexts [\": 1 2 ;\"] `shouldBe` Left InvalidWord\n-\n-    it \"calling a non-existing word\" $\n-      runTexts [\"1 foo\"] `shouldBe` Left (UnknownWord \"foo\")\n+    describe \"parsing and numbers\" $ do\n+      it \"empty input results in empty stack\" $\n+        toList empty `shouldBe` []\n+\n+      it \"numbers just get pushed onto the stack\" $\n+        runTexts [\"1 2 3 4 5\"] `shouldBe` Right [1, 2, 3, 4, 5]\n+\n+      it \"all non-word characters are separators\" $\n+        runTexts [\"1\\NUL2\\SOH3\\n4\\r5 6\\t7\"] `shouldBe` Right [1, 2, 3, 4, 5, 6, 7]\n+\n+    describe \"division\" $\n+      it \"errors if dividing by zero\" $\n+        runTexts [\"4 0 /\"] `shouldBe` Left DivisionByZero\n+\n+    describe \"combined arithmetic\" $ do\n+      it \"addition and subtraction\" $\n+        runTexts [\"1 2 + 4 -\"] `shouldBe` Right [-1]\n+\n+      it \"multiplication and division\" $\n+        runTexts [\"2 4 * 3 /\"] `shouldBe` Right [2]\n+\n+    describe \"dup\" $ do\n+      it \"copies the top value on the stack\" $\n+        runTexts [\"1 DUP\"  ] `shouldBe` Right [1, 1]\n+      it \"is case-insensitive\" $\n+        runTexts [\"1 2 Dup\"] `shouldBe` Right [1, 2, 2]\n+      it \"errors if there is nothing on the stack\" $\n+        runTexts [\"dup\"    ] `shouldBe` Left StackUnderflow\n+\n+    describe \"drop\" $ do\n+      it \"removes the top value on the stack if it is the only one\" $\n+        runTexts [\"1 drop\"  ] `shouldBe` Right []\n+      it \"removes the top value on the stack if it is not the only one\" $\n+        runTexts [\"1 2 drop\"] `shouldBe` Right [1]\n+      it \"errors if there is nothing on the stack\" $\n+        runTexts [\"drop\"    ] `shouldBe` Left StackUnderflow\n+\n+    describe \"swap\" $ do\n+      it \"swaps the top two values on the stack if they are the only ones\" $\n+        runTexts [\"1 2 swap\"  ] `shouldBe` Right [2, 1]\n+      it \"swaps the top two values on the stack if they are not the only ones\" $\n+        runTexts [\"1 2 3 swap\"] `shouldBe` Right [1, 3, 2]\n+      it \"errors if there is nothing on the stack\" $\n+        runTexts [\"swap\"      ] `shouldBe` Left StackUnderflow\n+      it \"errors if there is only one value on the stack\" $\n+        runTexts [\"1 swap\"    ] `shouldBe` Left StackUnderflow\n+\n+    describe \"over\" $ do\n+      it \"copies the second element if there are only two\" $\n+        runTexts [\"1 2 over\"  ] `shouldBe` Right [1, 2, 1]\n+      it \"copies the second element if there are more than two\" $\n+        runTexts [\"1 2 3 over\"] `shouldBe` Right [1, 2, 3, 2]\n+      it \"errors if there is nothing on the stack\" $\n+        runTexts [\"1 over\"    ] `shouldBe` Left StackUnderflow","path":"exercises/forth/test/Tests.hs","position":166,"original_position":116,"commit_id":"349136e0950160b50caf3ec85e27594083320992","original_commit_id":"6a3858a1b119455ea1d42c715f7ae8b00fd7e726","user":{"login":"petertseng","id":346181,"avatar_url":"https://avatars.githubusercontent.com/u/346181?v=3","gravatar_id":"","url":"https://api.github.com/users/petertseng","html_url":"https://github.com/petertseng","followers_url":"https://api.github.com/users/petertseng/followers","following_url":"https://api.github.com/users/petertseng/following{/other_user}","gists_url":"https://api.github.com/users/petertseng/gists{/gist_id}","starred_url":"https://api.github.com/users/petertseng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/petertseng/subscriptions","organizations_url":"https://api.github.com/users/petertseng/orgs","repos_url":"https://api.github.com/users/petertseng/repos","events_url":"https://api.github.com/users/petertseng/events{/privacy}","received_events_url":"https://api.github.com/users/petertseng/received_events","type":"User","site_admin":false},"body":"actually it's even worse - the test message doesn't match the actual test!!!","created_at":"2016-11-07T01:54:41Z","updated_at":"2016-11-07T01:54:41Z","html_url":"https://github.com/exercism/xhaskell/pull/413#discussion_r86704650","pull_request_url":"https://api.github.com/repos/exercism/xhaskell/pulls/413","_links":{"self":{"href":"https://api.github.com/repos/exercism/xhaskell/pulls/comments/86704650"},"html":{"href":"https://github.com/exercism/xhaskell/pull/413#discussion_r86704650"},"pull_request":{"href":"https://api.github.com/repos/exercism/xhaskell/pulls/413"}}},"pull_request":{"url":"https://api.github.com/repos/exercism/xhaskell/pulls/413","id":92474963,"html_url":"https://github.com/exercism/xhaskell/pull/413","diff_url":"https://github.com/exercism/xhaskell/pull/413.diff","patch_url":"https://github.com/exercism/xhaskell/pull/413.patch","issue_url":"https://api.github.com/repos/exercism/xhaskell/issues/413","number":413,"state":"open","locked":false,"title":"forth: Add new tests from x-common","user":{"login":"petertseng","id":346181,"avatar_url":"https://avatars.githubusercontent.com/u/346181?v=3","gravatar_id":"","url":"https://api.github.com/users/petertseng","html_url":"https://github.com/petertseng","followers_url":"https://api.github.com/users/petertseng/followers","following_url":"https://api.github.com/users/petertseng/following{/other_user}","gists_url":"https://api.github.com/users/petertseng/gists{/gist_id}","starred_url":"https://api.github.com/users/petertseng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/petertseng/subscriptions","organizations_url":"https://api.github.com/users/petertseng/orgs","repos_url":"https://api.github.com/users/petertseng/repos","events_url":"https://api.github.com/users/petertseng/events{/privacy}","received_events_url":"https://api.github.com/users/petertseng/received_events","type":"User","site_admin":false},"body":"First commit is same as #412, the rest should bring us to match https://github.com/exercism/x-common/pull/394","created_at":"2016-11-06T02:39:37Z","updated_at":"2016-11-07T01:54:41Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9e7575770d3156604d390d930ce2edd86b0462e5","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/exercism/xhaskell/pulls/413/commits","review_comments_url":"https://api.github.com/repos/exercism/xhaskell/pulls/413/comments","review_comment_url":"https://api.github.com/repos/exercism/xhaskell/pulls/comments{/number}","comments_url":"https://api.github.com/repos/exercism/xhaskell/issues/413/comments","statuses_url":"https://api.github.com/repos/exercism/xhaskell/statuses/349136e0950160b50caf3ec85e27594083320992","head":{"label":"petertseng:forth2","ref":"forth2","sha":"349136e0950160b50caf3ec85e27594083320992","user":{"login":"petertseng","id":346181,"avatar_url":"https://avatars.githubusercontent.com/u/346181?v=3","gravatar_id":"","url":"https://api.github.com/users/petertseng","html_url":"https://github.com/petertseng","followers_url":"https://api.github.com/users/petertseng/followers","following_url":"https://api.github.com/users/petertseng/following{/other_user}","gists_url":"https://api.github.com/users/petertseng/gists{/gist_id}","starred_url":"https://api.github.com/users/petertseng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/petertseng/subscriptions","organizations_url":"https://api.github.com/users/petertseng/orgs","repos_url":"https://api.github.com/users/petertseng/repos","events_url":"https://api.github.com/users/petertseng/events{/privacy}","received_events_url":"https://api.github.com/users/petertseng/received_events","type":"User","site_admin":false},"repo":{"id":50249772,"name":"xhaskell","full_name":"petertseng/xhaskell","owner":{"login":"petertseng","id":346181,"avatar_url":"https://avatars.githubusercontent.com/u/346181?v=3","gravatar_id":"","url":"https://api.github.com/users/petertseng","html_url":"https://github.com/petertseng","followers_url":"https://api.github.com/users/petertseng/followers","following_url":"https://api.github.com/users/petertseng/following{/other_user}","gists_url":"https://api.github.com/users/petertseng/gists{/gist_id}","starred_url":"https://api.github.com/users/petertseng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/petertseng/subscriptions","organizations_url":"https://api.github.com/users/petertseng/orgs","repos_url":"https://api.github.com/users/petertseng/repos","events_url":"https://api.github.com/users/petertseng/events{/privacy}","received_events_url":"https://api.github.com/users/petertseng/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/petertseng/xhaskell","description":"Exercism Exercises in Haskell","fork":true,"url":"https://api.github.com/repos/petertseng/xhaskell","forks_url":"https://api.github.com/repos/petertseng/xhaskell/forks","keys_url":"https://api.github.com/repos/petertseng/xhaskell/keys{/key_id}","collaborators_url":"https://api.github.com/repos/petertseng/xhaskell/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/petertseng/xhaskell/teams","hooks_url":"https://api.github.com/repos/petertseng/xhaskell/hooks","issue_events_url":"https://api.github.com/repos/petertseng/xhaskell/issues/events{/number}","events_url":"https://api.github.com/repos/petertseng/xhaskell/events","assignees_url":"https://api.github.com/repos/petertseng/xhaskell/assignees{/user}","branches_url":"https://api.github.com/repos/petertseng/xhaskell/branches{/branch}","tags_url":"https://api.github.com/repos/petertseng/xhaskell/tags","blobs_url":"https://api.github.com/repos/petertseng/xhaskell/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/petertseng/xhaskell/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/petertseng/xhaskell/git/refs{/sha}","trees_url":"https://api.github.com/repos/petertseng/xhaskell/git/trees{/sha}","statuses_url":"https://api.github.com/repos/petertseng/xhaskell/statuses/{sha}","languages_url":"https://api.github.com/repos/petertseng/xhaskell/languages","stargazers_url":"https://api.github.com/repos/petertseng/xhaskell/stargazers","contributors_url":"https://api.github.com/repos/petertseng/xhaskell/contributors","subscribers_url":"https://api.github.com/repos/petertseng/xhaskell/subscribers","subscription_url":"https://api.github.com/repos/petertseng/xhaskell/subscription","commits_url":"https://api.github.com/repos/petertseng/xhaskell/commits{/sha}","git_commits_url":"https://api.github.com/repos/petertseng/xhaskell/git/commits{/sha}","comments_url":"https://api.github.com/repos/petertseng/xhaskell/comments{/number}","issue_comment_url":"https://api.github.com/repos/petertseng/xhaskell/issues/comments{/number}","contents_url":"https://api.github.com/repos/petertseng/xhaskell/contents/{+path}","compare_url":"https://api.github.com/repos/petertseng/xhaskell/compare/{base}...{head}","merges_url":"https://api.github.com/repos/petertseng/xhaskell/merges","archive_url":"https://api.github.com/repos/petertseng/xhaskell/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/petertseng/xhaskell/downloads","issues_url":"https://api.github.com/repos/petertseng/xhaskell/issues{/number}","pulls_url":"https://api.github.com/repos/petertseng/xhaskell/pulls{/number}","milestones_url":"https://api.github.com/repos/petertseng/xhaskell/milestones{/number}","notifications_url":"https://api.github.com/repos/petertseng/xhaskell/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/petertseng/xhaskell/labels{/name}","releases_url":"https://api.github.com/repos/petertseng/xhaskell/releases{/id}","deployments_url":"https://api.github.com/repos/petertseng/xhaskell/deployments","created_at":"2016-01-23T17:35:50Z","updated_at":"2016-01-23T17:35:51Z","pushed_at":"2016-11-07T01:46:40Z","git_url":"git://github.com/petertseng/xhaskell.git","ssh_url":"git@github.com:petertseng/xhaskell.git","clone_url":"https://github.com/petertseng/xhaskell.git","svn_url":"https://github.com/petertseng/xhaskell","homepage":null,"size":657,"stargazers_count":0,"watchers_count":0,"language":"Haskell","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"exercism:master","ref":"master","sha":"82ae062eb27679110b633478de5890ba82b45a38","user":{"login":"exercism","id":5624255,"avatar_url":"https://avatars.githubusercontent.com/u/5624255?v=3","gravatar_id":"","url":"https://api.github.com/users/exercism","html_url":"https://github.com/exercism","followers_url":"https://api.github.com/users/exercism/followers","following_url":"https://api.github.com/users/exercism/following{/other_user}","gists_url":"https://api.github.com/users/exercism/gists{/gist_id}","starred_url":"https://api.github.com/users/exercism/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/exercism/subscriptions","organizations_url":"https://api.github.com/users/exercism/orgs","repos_url":"https://api.github.com/users/exercism/repos","events_url":"https://api.github.com/users/exercism/events{/privacy}","received_events_url":"https://api.github.com/users/exercism/received_events","type":"Organization","site_admin":false},"repo":{"id":17273391,"name":"xhaskell","full_name":"exercism/xhaskell","owner":{"login":"exercism","id":5624255,"avatar_url":"https://avatars.githubusercontent.com/u/5624255?v=3","gravatar_id":"","url":"https://api.github.com/users/exercism","html_url":"https://github.com/exercism","followers_url":"https://api.github.com/users/exercism/followers","following_url":"https://api.github.com/users/exercism/following{/other_user}","gists_url":"https://api.github.com/users/exercism/gists{/gist_id}","starred_url":"https://api.github.com/users/exercism/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/exercism/subscriptions","organizations_url":"https://api.github.com/users/exercism/orgs","repos_url":"https://api.github.com/users/exercism/repos","events_url":"https://api.github.com/users/exercism/events{/privacy}","received_events_url":"https://api.github.com/users/exercism/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/exercism/xhaskell","description":"Exercism Exercises in Haskell","fork":false,"url":"https://api.github.com/repos/exercism/xhaskell","forks_url":"https://api.github.com/repos/exercism/xhaskell/forks","keys_url":"https://api.github.com/repos/exercism/xhaskell/keys{/key_id}","collaborators_url":"https://api.github.com/repos/exercism/xhaskell/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/exercism/xhaskell/teams","hooks_url":"https://api.github.com/repos/exercism/xhaskell/hooks","issue_events_url":"https://api.github.com/repos/exercism/xhaskell/issues/events{/number}","events_url":"https://api.github.com/repos/exercism/xhaskell/events","assignees_url":"https://api.github.com/repos/exercism/xhaskell/assignees{/user}","branches_url":"https://api.github.com/repos/exercism/xhaskell/branches{/branch}","tags_url":"https://api.github.com/repos/exercism/xhaskell/tags","blobs_url":"https://api.github.com/repos/exercism/xhaskell/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/exercism/xhaskell/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/exercism/xhaskell/git/refs{/sha}","trees_url":"https://api.github.com/repos/exercism/xhaskell/git/trees{/sha}","statuses_url":"https://api.github.com/repos/exercism/xhaskell/statuses/{sha}","languages_url":"https://api.github.com/repos/exercism/xhaskell/languages","stargazers_url":"https://api.github.com/repos/exercism/xhaskell/stargazers","contributors_url":"https://api.github.com/repos/exercism/xhaskell/contributors","subscribers_url":"https://api.github.com/repos/exercism/xhaskell/subscribers","subscription_url":"https://api.github.com/repos/exercism/xhaskell/subscription","commits_url":"https://api.github.com/repos/exercism/xhaskell/commits{/sha}","git_commits_url":"https://api.github.com/repos/exercism/xhaskell/git/commits{/sha}","comments_url":"https://api.github.com/repos/exercism/xhaskell/comments{/number}","issue_comment_url":"https://api.github.com/repos/exercism/xhaskell/issues/comments{/number}","contents_url":"https://api.github.com/repos/exercism/xhaskell/contents/{+path}","compare_url":"https://api.github.com/repos/exercism/xhaskell/compare/{base}...{head}","merges_url":"https://api.github.com/repos/exercism/xhaskell/merges","archive_url":"https://api.github.com/repos/exercism/xhaskell/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/exercism/xhaskell/downloads","issues_url":"https://api.github.com/repos/exercism/xhaskell/issues{/number}","pulls_url":"https://api.github.com/repos/exercism/xhaskell/pulls{/number}","milestones_url":"https://api.github.com/repos/exercism/xhaskell/milestones{/number}","notifications_url":"https://api.github.com/repos/exercism/xhaskell/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/exercism/xhaskell/labels{/name}","releases_url":"https://api.github.com/repos/exercism/xhaskell/releases{/id}","deployments_url":"https://api.github.com/repos/exercism/xhaskell/deployments","created_at":"2014-02-28T02:59:12Z","updated_at":"2016-10-26T11:50:51Z","pushed_at":"2016-11-07T01:54:40Z","git_url":"git://github.com/exercism/xhaskell.git","ssh_url":"git@github.com:exercism/xhaskell.git","clone_url":"https://github.com/exercism/xhaskell.git","svn_url":"https://github.com/exercism/xhaskell","homepage":null,"size":24546,"stargazers_count":70,"watchers_count":70,"language":"Haskell","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":43,"mirror_url":null,"open_issues_count":13,"forks":43,"open_issues":13,"watchers":70,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/exercism/xhaskell/pulls/413"},"html":{"href":"https://github.com/exercism/xhaskell/pull/413"},"issue":{"href":"https://api.github.com/repos/exercism/xhaskell/issues/413"},"comments":{"href":"https://api.github.com/repos/exercism/xhaskell/issues/413/comments"},"review_comments":{"href":"https://api.github.com/repos/exercism/xhaskell/pulls/413/comments"},"review_comment":{"href":"https://api.github.com/repos/exercism/xhaskell/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/exercism/xhaskell/pulls/413/commits"},"statuses":{"href":"https://api.github.com/repos/exercism/xhaskell/statuses/349136e0950160b50caf3ec85e27594083320992"}}}}
{"actor":{"display_login":"petertseng"}}