<div dir="auto">Hello Hilco,<div dir="auto"><br></div><div dir="auto">Please, do file a bug.</div><div dir="auto"><br></div><div dir="auto">--</div><div dir="auto">Best, Artem</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Sep 5, 2019, 1:26 AM Hilco Wijbenga <<a href="mailto:hilco.wijbenga@gmail.com">hilco.wijbenga@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Wed, Sep 4, 2019 at 10:14 PM Hilco Wijbenga <<a href="mailto:hilco.wijbenga@gmail.com" target="_blank" rel="noreferrer">hilco.wijbenga@gmail.com</a>> wrote:<br>
><br>
> On Tue, Sep 3, 2019 at 11:14 PM Ben Gamari <<a href="mailto:ben@smart-cactus.org" target="_blank" rel="noreferrer">ben@smart-cactus.org</a>> wrote:<br>
> ><br>
> > On September 4, 2019 4:32:29 AM GMT+02:00, Hilco Wijbenga <<a href="mailto:hilco.wijbenga@gmail.com" target="_blank" rel="noreferrer">hilco.wijbenga@gmail.com</a>> wrote:<br>
> > >Hi all,<br>
> > ><br>
> > >I have a very simple<br>
> > ><br>
> > >newtype Index = Index Int deriving (Eq, Ord, Enum)<br>
> > ><br>
> > >for which I have written tests with both HSpec and QuickCheck.<br>
> > >Specifically, I have written tests for "==", "/=", "compare" (for all<br>
> > >of EQ, LT, and GT), and "toEnum" & "fromEnum". So I thought I had<br>
> > >_very_ thoroughly covered that one line. :-)<br>
> > ><br>
> > >Unfortunately, after running "stack clean ; stack test --coverage" I<br>
> > >see in the HTML report that only Eq has been tested and that Ord and<br>
> > >Enum have _no_ coverage (i.e. "never executed").<br>
> > ><br>
> > >(The module also has some regular functions and an explicit Show<br>
> > >instance [all with tests] and those are apparently fine. So coverage<br>
> > >does seem to work but not the way I expect?)<br>
> > ><br>
> > >What am I doing wrong?<br>
> > ><br>
> > >Cheers,<br>
> > >Hilco<br>
> > >_______________________________________________<br>
> > >Haskell-Cafe mailing list<br>
> > >To (un)subscribe, modify options or view archives go to:<br>
> > ><a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
> > >Only members subscribed via the mailman list are allowed to post.<br>
> ><br>
> > This sounds like it may be a ghc bug. Can you open a ticket at <a href="https://gitlab.haskell.org/ghc/ghc" rel="noreferrer noreferrer" target="_blank">https://gitlab.haskell.org/ghc/ghc</a>?<br>
><br>
> Well, I wasn't expecting that. :-)<br>
><br>
> I created a tiny test project with just the newtype and even removed<br>
> Enum. I tried all LTSs listed at <a href="https://www.stackage.org" rel="noreferrer noreferrer" target="_blank">https://www.stackage.org</a> from<br>
> LST-3.22 all the way up to nightly-2019-09-04 and they all behave the<br>
> same way. (Stack is _awesome_ for this.) I also tried "data" instead<br>
> of "newtype". That made no difference.<br>
><br>
> Are you sure this might be a GHC bug? Surely someone would have<br>
> noticed sometime during the last 4 years? It would have been in GHC<br>
> 7.10.2 already. Anyway, if "yes" then I'll create an issue. It should<br>
> be very easy to reproduce. (I don't mean to doubt you but it's rather<br>
> rare in software that it's "the compiler" and not "the developer". :-)<br>
> I don't want to waste anyone's time.)<br>
<br>
Mmm, so for sake of completeness:<br>
<br>
----- Lib.hs<br>
module Lib where<br>
newtype Index = Index Int deriving (Eq, Ord, Show)<br>
<br>
----- LibSpec.hs<br>
module LibSpec (spec) where<br>
<br>
import Test.Hspec<br>
import Test.QuickCheck<br>
import Lib<br>
<br>
genValidIndexes :: Gen (Index, Index)<br>
genValidIndexes = do lft <- choose (0, 100)<br>
    rgt <- choose (0, 100)<br>
    pure (Index lft, Index rgt)<br>
<br>
prop_EqIndex :: (Index, Index) -> Bool<br>
prop_EqIndex (lftIndex@(Index lft), rgtIndex@(Index rgt)) = (lftIndex<br>
== rgtIndex) == (lft == rgt)<br>
<br>
prop_OrdIndex :: (Index, Index) -> Bool<br>
prop_OrdIndex (lftIndex@(Index lft), rgtIndex@(Index rgt)) = compare<br>
lftIndex rgtIndex == compare lft rgt<br>
<br>
spec :: Spec<br>
spec<br>
  = do<br>
     describe "Index::Eq" $<br>
       do it "Index 0 == Index 0" $ Index 0 == Index 0 `shouldBe` True<br>
          it "Index 0 /= Index 1" $ Index 0 /= Index 1 `shouldBe` True<br>
          it "Index 1 /= Index 0" $ Index 1 /= Index 0 `shouldBe` True<br>
          it "prop_Eq" $ property $ forAll genValidIndexes prop_EqIndex<br>
     describe "Index::Ord" $<br>
       do it "compare (Index 0) (Index 0)" $ compare (Index 0) (Index<br>
0) `shouldBe` EQ<br>
          it "compare (Index 1) (Index 2)" $ compare (Index 1) (Index<br>
2) `shouldBe` LT<br>
          it "compare (Index 2) (Index 1)" $ compare (Index 2) (Index<br>
1) `shouldBe` GT<br>
          it "prop_OrdIndex" $ property $ forAll genValidIndexes prop_OrdIndex<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</blockquote></div>