[from now] 2013/05/09 01:53:25

diff --git a/src/test/groovy/Hoge.groovy b/src/test/groovy/Hoge.groovy
deleted file mode 100644
index b030938..0000000
--- a/src/test/groovy/Hoge.groovy
+++ /dev/null
@@ -1,8 +0,0 @@
-import spock.lang.Specification
-
-class Hoge extends Specification {
-
-    def "xxx"() {
-        expect: true
-    }
-}
diff --git a/src/test/groovy/basic/Basic01_BlockSpec.groovy b/src/test/groovy/basic/Basic01_BlockSpec.groovy
index 5dd35ea..6d8ca08 100644
--- a/src/test/groovy/basic/Basic01_BlockSpec.groovy
+++ b/src/test/groovy/basic/Basic01_BlockSpec.groovy
@@ -40,9 +40,9 @@ class Basic01_BlockSpec extends EmbeddedSpec {
     def "ただしexpectブロックは連続して使用できない"() {
         when:
         compiler.compileFeatureBody """
-            expect: true
-            expect: true
-        """
+        | expect: true
+        | expect: true
+        """.stripMargin()

         then:
         InvalidSpecCompileException e = thrown()
@@ -87,12 +87,4 @@ class Basic01_BlockSpec extends EmbeddedSpec {
         and: "先頭要素はspock"
         stack.peek() == "spock"
     }
-
-    def "xx"() {
-        setup:
-        def x = "hello"
-        def y = "hallo"
-        expect:
-        x == y
-    }
 }
diff --git a/src/test/groovy/basic/Basic02_SetupSpec.groovy b/src/test/groovy/basic/Basic02_SetupSpec.groovy
index 23e831a..0d1894a 100644
--- a/src/test/groovy/basic/Basic02_SetupSpec.groovy
+++ b/src/test/groovy/basic/Basic02_SetupSpec.groovy
@@ -37,8 +37,8 @@ class Basic02_SetupSpec extends EmbeddedSpec {
     def "複数のsetupブロックを宣言することはできない"() {
         when:
         compiler.compileFeatureBody """
-            setup: true
-            setup: true
+        | setup: true
+        | setup: true
         """

         then:
diff --git a/src/test/groovy/basic/Basic03_WhenThenSpec.groovy b/src/test/groovy/basic/Basic03_WhenThenSpec.groovy
index 4807643..f778160 100644
--- a/src/test/groovy/basic/Basic03_WhenThenSpec.groovy
+++ b/src/test/groovy/basic/Basic03_WhenThenSpec.groovy
@@ -42,12 +42,12 @@ class Basic03_WhenThenSpec extends EmbeddedSpec {
     def "コンディションが失敗した場合はパワーアサートの出力"() {
         when:
         runner.runFeatureBody """
-            when:
-            def x = 1
-            def y = 2
-            then:
-            x == y
-        """
+        | when:
+        | def x = 1
+        | def y = 2
+        | then:
+        | x == y
+        """.stripMargin()

         then:
         SpockComparisonFailure e = thrown()
@@ -68,15 +68,16 @@ class Basic03_WhenThenSpec extends EmbeddedSpec {
             it > 0 // これはコンティションとして認識されない
         }

-        and: "回避方法1: 明示的なアサート"
-        list.each {
-            assert it > 0
-        }

-        and: "回避方法2: トップレベルの式で評価行えるようにする"
+        and: "回避方法1: トップレベルの式で評価行えるようにする"
         list.every {
             it > 0
         }
+
+        and: "回避方法2: 明示的なアサート"
+        list.each {
+            assert it > 0
+        }
     }

     def "コンディションのグループ化"() {
diff --git a/src/test/groovy/basic/Basic07_FixtureSpec.groovy b/src/test/groovy/basic/Basic07_FixtureSpec.groovy
index 85a949d..bc65e10 100644
--- a/src/test/groovy/basic/Basic07_FixtureSpec.groovy
+++ b/src/test/groovy/basic/Basic07_FixtureSpec.groovy
@@ -1,8 +1,6 @@
 package basic

 import spock.lang.Shared
-import spock.lang.Specification
-import spock.util.EmbeddedSpecRunner
 import util.EmbeddedSpec

 class Basic07_FixtureSpec extends EmbeddedSpec {
@@ -40,28 +38,28 @@ class Basic07_FixtureSpec extends EmbeddedSpec {
     def "フィクスチャの初期化順序"() {
         when:
         runner.runWithImports """
-            abstract class Base extends Specification {
-              def getLog() { basic.Basic07_FixtureSpec.log }
-
-              def baseField = new Object(){{ basic.Basic07_FixtureSpec.log << "baseField" }}
-              def setup() { log << "baseSetup" }
-              def cleanup() { log << "baseCleanup" }
-              def setupSpec() { log << "baseSetupSpec" }
-              def cleanupSpec() { log << "baseCleanupSpec" }
-            }
-
-            class ChildSpec extends Base {
-              def getLog() { basic.Basic07_FixtureSpec.log }
-
-              def childFiled = new Object(){{ basic.Basic07_FixtureSpec.log << "childField" }}
-              def setup() { log << "childSetup" }
-              def cleanup() { log << "childCleanup" }
-              def setupSpec() { log << "childSetupSpec" }
-              def cleanupSpec() { log << "childCleanupSpec" }
-
-              def feature() { expect: true }
-            }
-        """
+        | abstract class Base extends Specification {
+        |   def getLog() { basic.Basic07_FixtureSpec.log }
+        |
+        |   def baseField = new Object(){{ basic.Basic07_FixtureSpec.log << "baseField" }}
+        |   def setup() { log << "baseSetup" }
+        |   def cleanup() { log << "baseCleanup" }
+        |   def setupSpec() { log << "baseSetupSpec" }
+        |   def cleanupSpec() { log << "baseCleanupSpec" }
+        | }
+        |
+        | class ChildSpec extends Base {
+        |   def getLog() { basic.Basic07_FixtureSpec.log }
+        |
+        |   def childFiled = new Object(){{ basic.Basic07_FixtureSpec.log << "childField" }}
+        |   def setup() { log << "childSetup" }
+        |   def cleanup() { log << "childCleanup" }
+        |   def setupSpec() { log << "childSetupSpec" }
+        |   def cleanupSpec() { log << "childCleanupSpec" }
+        |
+        |   def feature() { expect: true }
+        | }
+        """.stripMargin()

         then:
         log == [
@@ -74,7 +72,7 @@ class Basic07_FixtureSpec extends EmbeddedSpec {
             "childCleanup",
             "baseCleanup",
             "childCleanupSpec",
-            "baseCleanupSpec"
+            "baseCleanupSpec",
         ]
     }

diff --git a/src/test/groovy/extension/FailWithSpec.groovy b/src/test/groovy/extension/FailWithSpec.groovy
new file mode 100644
index 0000000..73d136a
--- /dev/null
+++ b/src/test/groovy/extension/FailWithSpec.groovy
@@ -0,0 +1,39 @@
+package extension
+
+import groovy.transform.InheritConstructors
+import spock.lang.FailsWith
+import spock.lang.Specification
+
+class FailWithSpec extends Specification {
+
+    @FailsWith(IndexOutOfBoundsException)
+    def "FailsWithの基本"() {
+        expect:
+        [].get(0) // IndexOutOfBoundsExceptionがスローされる
+    }
+
+    @FailsWith(value = NullPointerException, reason = "ぬるぽ")
+    def "reasonに理由を書ける"() {
+        expect:
+        null.ぬるぽ
+    }
+}
+
+// スペッククラスに付与しても良い
+@FailsWith(NullPointerException)
+class FailWithOnSpec extends Specification {
+
+    def "ぬるぽで終了する"() {
+        expect:
+        null.ぬるぽ
+    }
+
+    @FailsWith(IndexOutOfBoundsException)
+    def "スペッククラスに付与しつつフィーチャメソッドでオーバライドもOK"() {
+        expect:
+        [].get(0)
+    }
+}
+
+@InheritConstructors
+class MyException extends Exception {}
\ No newline at end of file
diff --git a/src/test/groovy/extension/IgnoreIfSpec.groovy b/src/test/groovy/extension/IgnoreIfSpec.groovy
new file mode 100644
index 0000000..d3fa74b
--- /dev/null
+++ b/src/test/groovy/extension/IgnoreIfSpec.groovy
@@ -0,0 +1,64 @@
+package extension
+
+import spock.lang.IgnoreIf
+import spock.lang.Specification
+
+/**
+ * {@link spock.lang.IgnoreIf}は引数のクロージャの実行結果が
+ * {@code ture}の場合、そのフィーチャメソッドを無視する
+ *
+ * <ul>
+ *     <li>env - System.getenv()のショートカット
+ *     <li>properties - System.getProperties()のショートカット
+ *     <li>javaVersion - Javaのバージョン
+ * </ul>
+ */
+class IgnoreIfSpec extends Specification {
+
+    @IgnoreIf({ true })
+    def "trueなので無視される"() {
+        expect: false
+    }
+
+    @IgnoreIf({ false })
+    def "falseなので無視されない"() {
+        expect: true
+    }
+
+    @IgnoreIf({ 1 < 2 })
+    def "1 < 2 はtrueなので無視される"() {
+        expect: false
+    }
+
+    @IgnoreIf({ 1 > 2 })
+    def "1 > 2 はfalseなので実行される"() {
+        expect: true
+    }
+
+    @IgnoreIf({
+        def a = 1
+        def b = 1
+        a + b == 2
+    })
+    def "closureをcallしているだけなので複数行書いても良い"() {
+        expect: false
+    }
+
+    // v0.7の時点で以下で動作しているが
+    // 次バージョンで参照方法が変わるかもしれないので注意
+
+    @IgnoreIf({ javaVersion > 1.4 })
+    def "javaVersionでJVMのバージョンが参照できる"() {
+        expect: true
+    }
+
+    @IgnoreIf({ env.LANG == 'C' })
+    def "envがSystem.getenv()のショートカットになっている"() {
+        expect: true
+    }
+
+    @IgnoreIf({ properties["os.name"] == 'Mac OS X' })
+    def "propertiesがSystem.getProperties()のショートカットになっている"() {
+        expect: true
+    }
+}
diff --git a/src/test/groovy/extension/IgnoreRestSpec.groovy b/src/test/groovy/extension/IgnoreRestSpec.groovy
new file mode 100644
index 0000000..9cd14f8
--- /dev/null
+++ b/src/test/groovy/extension/IgnoreRestSpec.groovy
@@ -0,0 +1,24 @@
+package extension
+
+import spock.lang.IgnoreRest
+import spock.lang.Specification
+
+/**
+ * IgnoreRestを付与すると付与したフィーチャメソッドだけが実行される
+ */
+class IgnoreRestSpec extends Specification {
+
+    def "このフィーチャメソッドは実行されない"() {
+        expect: false
+    }
+
+    @IgnoreRest
+    def "このフィーチャメソッドは実行される"() {
+        expect: true
+    }
+
+    @IgnoreRest
+    def "複数のフィーチャメソッドに@IgnoreRestを設定できる"() {
+        expect: true
+    }
+}
\ No newline at end of file
diff --git a/src/test/groovy/extension/IgnoreSpec.groovy b/src/test/groovy/extension/IgnoreSpec.groovy
new file mode 100644
index 0000000..1bfe61d
--- /dev/null
+++ b/src/test/groovy/extension/IgnoreSpec.groovy
@@ -0,0 +1,34 @@
+import spock.lang.Ignore
+import util.EmbeddedSpec
+
+class IgnoreSpec extends EmbeddedSpec {
+
+    @Ignore
+    def "このフィーチャメソッドは無視される"() {
+        expect: false
+    }
+
+    @Ignore
+    def "複数のフィーチャメソッドに@Ignoreを設定できる"() {
+        expect: false
+    }
+
+    def "スペッククラスに付与するとフィーチャメソッドすべてが無視される"() {
+        when:
+        def result = runner.runWithImports """
+        | @Ignore
+        | class Hoge extends Specification {
+        |   def foo() {
+        |     expect: false
+        |   }
+        |
+        |   def bar() {
+        |     expect: false
+        |   }
+        | }
+        """.stripMargin()
+
+        then:
+        result.runCount == 0
+    }
+}
\ No newline at end of file