IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

GHCやghciでワーニングを出さない

:set -w です。

stackoverflow.com

Attoparsec の parseOnly は 残りにエラーがあったとしても、成功したところまでの結果を成功として返す

全部消費した上で判断したい場合はendOfInputを合成する。

gist.github.com

Haskellのテスト構成イメージ

こんなイメージ

cabal
 |
 +--> TestSuite
       |
       +--> Tasty
             |
             +-(bridge)-> HSpec
             |             |
             |             +-(bridge)-> hspec-attoparsec
             |
             +-(bridge)-> QuickCheck
             

TLSの暗号スゥイートの値一覧

ここにあったか。。

Transport Layer Security (TLS) Parameters

いや、仕様書自体にあるみたい。下は1.1のだけど。

The Transport Layer Security (TLS) Protocol Version 1.1

HaskellのTLSサンプル

tls packageを直接使うのは辛いのでNetwork.Connectionを使うと楽かも。

gist.github.com

cabalのreplでテストスイートを使う

Haskellのテストをcabalで行う時は、下記のように実行します。(configureは毎回出なくて大丈夫ですが)

% cabal configure --enable-tests
% cabal build
% cabal test

テストコードを少し書くごとにcabal buildするのは、テストが蓄積されると時間がかかります。テストコードを書いている時に、replでテストコードを試せると便利だと思います。通常では、executablelibraryの依存関係をreplは使っていると思います。そこにテスト関連のライブラリの依存関係はもたせたくないということです。

詳しいことはわかっていないのですが、cabal repl時にTest-Suite名を指定すると、そのテストスイートの依存関係でのreplが起動するようです。

-- Test
Test-Suite MyTestSuite01
  type: exitcode-stdio-1.0
  main-is: MyTest01.hs
  hs-source-dirs: test
                 ,src -- これは余計で、本来は、cabalのname自体をbuild-dependsに書くべき
  ghc-options: -Wall
  build-depends:       base >=4.9 && <4.10
                     , tasty
                     , tasty-hunit
                     , protocol-buffers >=2.4 && <2.5
                     , protocol-buffers-descriptor >=2.4 && <2.5
                     , network
 .. 以下省略

としておいて、

% cabal repl MyTestSuite01

で起動します。

*Main> :l test/MyTest01.hs
*Main> main
my_test_01: FAIL
  1=2 ?
  expected: 1
   but got: 2

1 out of 1 tests failed (0.00s)
*** Exception: ExitFailure 1
*Main>

使ったコードは下記です。

module Main where

import Test.Tasty
import Test.Tasty.HUnit
import System.Exit (exitFailure)

main =defaultMain (testCase "my_test_01" (assertEqual "1=2 ?" 1 2) )