[![Build Status](https://travis-ci.org/tokuhirom/Test-Kantan.png?branch=master)](https://travis-ci.org/tokuhirom/Test-Kantan)
# NAME

Test::Kantan - simple, flexible, fun "Testing framework"

# SYNOPSIS

   use Test::Kantan;

   describe 'String', sub {
     describe 'index', sub {
       it 'should return -1 when the value is not matched', sub {
         expect(index("abc", 'x'))->to_be(-1);
         expect(index("abc", 'a'))->to_be(0);
       };
     };
   };

# DESCRIPTION

Test::Kantan is a behavior-driven development framework for testing Perl 5 code.
It has a clean, obvious syntax so that you can easily write tests.

# CURRENT STATUS

Unstable. I will change the API without notice.

# Interfaces

There is 3 types for describing test cases.

## BDD style

RSpec/Jasmine like BDD style function names are available.

   describe 'String', sub {
     before_each { ... };
     describe 'index', sub {
       it 'should return -1 when the value is not matched', sub {
         expect(index("abc", 'x'))->to_be(-1);
         expect(index("abc", 'a'))->to_be(0);
       };
     };
   };

   done_testing;

## Given-When-Then style

There is the Given-When-Then style functions.
It's really useful for describing real complex problems.

   Scenario 'String', sub {
     setup { ... };

     Feature 'Get the index from the code', sub {
       Given 'the string';
       my $str = 'abc';

       When 'get the index for "a"';
       my $i = index($str, 'a');

       Then 'the return value is 0';
       expect($i)->to_be(0);
     };
   };

   done_testing;

## Plain old Test::More style

   subtest 'String', sub {
     setup { ... };

     subtest 'index', sub {
       expect(index("abc", 'x'))->to_be(-1);
       expect(index("abc", 'a'))->to_be(0);
     };
   };

   done_testing;

# Assertions

Here is 2 type assertions.

## `ok()`

   ok { 1 };

There is the `ok` function. It takes one code block. The code returns true value if the test case was passed, false otherwise.

`ok()` returns the value what returned by the code.

## `expect()`

   expect($x)->to_be_true;

Here is the `expect` function like RSpec/Jasmine. For more details, please look [Test::Kantan::Expect](https://metacpan.org/pod/Test::Kantan::Expect).

# Utility functions

## ` diag($message) `

You can show the diagnostic message with ` diag() ` function.
Diagnostic message would not print if whole test cases in the subtest were passed.

It means, you can call diag() without worries about the messages is a obstacle.

# ENVIRONMENT VARIABLES

- KANTAN\_REPORTER

   You can specify the reporter class by KANTAN\_REPORTER environment variable.

       KANTAN_REPORTER=TAP perl -Ilib t/01_simple.t

- KANTAN\_CUTOFF

   Kantan cut the diagnostic message by 80 bytes by default.
   If you want to change this value, you can set by KANTAN\_CUTOFF.

       KANTAN_CUTOFF=10000 perl -Ilib t/01_simple.t

# Tips

## How do I suppress output from Log::Minimal?

Log::Minimal outputs logs to STDERR by default.

   $Log::Minimal::PRINT = sub {
       my ( $time, $type, $message, $trace,$raw_message) = @_;
       local $Test::Kantan::Level = $Test::Kantan::Level + 3;
       Test::Kantan::diag("$time [$type] $message at $trace", 1024);
   };

# How do I use the testing library based on Test::Builder?

Test::Kantan replace some methods in Test::Builder.
You can use the library based on Test::Builder with Test::Kantan :)

# LICENSE

Copyright (C) Tokuhiro Matsuno.

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

# AUTHOR

Tokuhiro Matsuno <[email protected]>