[from now] 2013/05/10 19:14:37

diff --git a/docs/03_datadriven.md b/docs/03_datadriven.md
index 4d81578..1269569 100644
--- a/docs/03_datadriven.md
+++ b/docs/03_datadriven.md
@@ -16,7 +16,7 @@
 データテーブル
 --------------

-データ駆動テストを一番簡単にやるにはデータテーブルを使う
+データ駆動テストをやるには、データテーブルを使うのが一番簡単

 ```groovy
 class Math extends Specification {
@@ -33,4 +33,48 @@ class Math extends Specification {
 }
 ```

+### シンタックスの改善
+
+以下のようにも書ける
+
+```groovy
+def "シンタックスの改善"(/* メソッドの引数は省略可能*/) {
+    expect:
+    Math.max(x, y) == z
+
+    where: "データの区切りに||を使用できる"
+    x | y || z
+    1 | 3 || 3
+    7 | 4 || 7
+    0 | 0 || 0
+}
+```
+
+### 値がひとつの場合
+
+`_`を使用する
+
+```groovy
+def "値が一つの場合"() {
+    expect:
+    Math.max(x, x) == x
+
+    where:
+    x | _
+    1 | _
+    7 | _
+    8 | _
+    // ただし、この書き方よりはデータパイプを使用した書き方のほうがおすすめ
+    // 不要な_は綺麗ではない
+}
+```
+
+### 注意点
+
+* `setup`メソッド、`cleanup`メソッドは繰り返しごとに呼ばれる
+* データテーブルから、ローカル変数やインタンスフィールドにアクセスできない
+* `@Share`または`static`フィールドにはアクセスできる
+
+@Unroll
+-------

diff --git a/src/test/groovy/learning/datadriventest/DDT01_BasicSpec.groovy b/src/test/groovy/learning/datadriventest/DDT01_BasicSpec.groovy
index de8fc3a..04c60b5 100644
--- a/src/test/groovy/learning/datadriventest/DDT01_BasicSpec.groovy
+++ b/src/test/groovy/learning/datadriventest/DDT01_BasicSpec.groovy
@@ -1,7 +1,7 @@
 package learning.datadriventest

-import org.spockframework.compiler.InvalidSpecCompileException
 import learning.util.EmbeddedSpec
+import org.spockframework.compiler.InvalidSpecCompileException

 class DDT01_BasicSpec extends EmbeddedSpec {

@@ -27,17 +27,17 @@ class DDT01_BasicSpec extends EmbeddedSpec {
         0 | 0 || 0
     }

-    def "データテーブルは必ず2以上のカラムが必要ない場合は_を使用する"() {
+    def "値が一つの場合は_を使用する"() {
         expect:
-        x > 0
+        Math.max(x, x) == x

         where:
         x | _
         1 | _
         7 | _
         8 | _
-        // 値が1つしかない場合はデータパイプを使用したほうがおすすめ
-        // 不要な_はあまり綺麗ではない
+        // ただし、この書き方よりはデータパイプを使用した書き方のほうがおすすめ
+        // 不要な_は綺麗ではない
     }

     def "インスタンスフィールドにはアクセス出来ないので注意"() {
@@ -54,7 +54,7 @@ class DDT01_BasicSpec extends EmbeddedSpec {
               instanceField | 1
             }
         """.stripMargin()
-
+
         then:
         def e = thrown(InvalidSpecCompileException)
         e.message =~ "Only @Shared and static fields may be accessed from here"
diff --git a/src/test/groovy/learning/datadriventest/DDT02_UnrollSpec.groovy b/src/test/groovy/learning/datadriventest/DDT02_UnrollSpec.groovy
index b52b6bc..445d1a4 100644
--- a/src/test/groovy/learning/datadriventest/DDT02_UnrollSpec.groovy
+++ b/src/test/groovy/learning/datadriventest/DDT02_UnrollSpec.groovy
@@ -1,65 +1,82 @@
 package learning.datadriventest

-import bank.Account
-import spock.lang.Unroll
 import learning.util.EmbeddedSpec
+import spock.lang.Unroll

 class DDT02_UnrollSpec extends EmbeddedSpec {

     @Unroll
     def "Unrollの基本"() {
         setup:
-        def account = new Account(balance: balance)
+        def person = new Person(name: name, age: age)

         expect:
-        account.empty == empty
+        person.isValid() == valid

-        true
         where:
-        balance | empty
-        0       | true
-        1       | false
+        name   | age  | valid
+        "Jeff" | null | false
+        "Jeff" | -1   | false
+        "Jeff" | 0    | true
+        "Jeff" | 30   | true
+        null   | 45   | false
+        null   | -1   | false
     }

     @Unroll
-    def "balanceが #balance の場合、isEmpty()は #empty"() {
+    def "名前が #name で年齢が #age の場合 #valid"() {
         setup:
-        def account = new Account(balance: balance)
+        def person = new Person(name: name, age: age)

         expect:
-        account.empty == empty
+        person.isValid() == valid

-        true
         where:
-        balance | empty
-        0       | true
-        1       | false
+        name   | age  | valid
+        "Jeff" | null | false
+        "Jeff" | -1   | false
+        "Jeff" | 0    | true
+        "Jeff" | 30   | true
+        null   | 45   | false
+        null   | -1   | false
     }

-    @Unroll("balanceが #balance の場合、isEmpty()は #empty")
+    @Unroll("名前が #name で年齢が #age の場合 #valid")
     def "アノテーションの中でも宣言できる"() {
         setup:
-        def account = new Account(balance: balance)
+        def person = new Person(name: name, age: age)

         expect:
-        account.empty == empty
+        person.isValid() == valid

-        true
         where:
-        balance | empty
-        0       | true
-        1       | false
+        name   | age  | valid
+        "Jeff" | null | false
+        "Jeff" | -1   | false
+        "Jeff" | 0    | true
+        "Jeff" | 30   | true
+        null   | 45   | false
+        null   | -1   | false
     }

-    @Unroll("#name.toUpperCase() の長さは #name.length")
-    def "引数なしのメソッド呼び出しとプロパティアクセスが使用可能"() {
+    @Unroll("#person.name.toUpperCase() の年齢は #person.age")
+    def "プレースホルダには引数なしのメソッド呼び出しとプロパティアクセスが使用可能"() {
         expect:
-        true
+        person.isValid()

         where:
-        name      | _
-        "Ethan"   | _
-        "Michael" | _
-        "Daniel"  | _
+        person                              | _
+        new Person(name: "Jeff", age: 23)   | _
+        new Person(name: "Burt", age: 43)   | _
+        new Person(name: "Graeme", age: 32) | _
+    }
+}
+
+class Person {
+    String name
+    Integer age
+
+    Boolean isValid() {
+        name && age >= 0
     }
 }