[GRIFFIN-298] add CompletenessExpr2DQSteps test case

Add some test case for CompletenessExpr2DQSteps transform, in addition some small code optimization.

Author: wankunde <wankunde@163.com>

Closes #550 from wankunde/CompletenessExpr2DQSteps.
diff --git a/measure/pom.xml b/measure/pom.xml
index 8fa5f5d..66ebe4c 100644
--- a/measure/pom.xml
+++ b/measure/pom.xml
@@ -44,7 +44,7 @@
         <slf4j.version>1.7.21</slf4j.version>
         <log4j.version>1.2.16</log4j.version>
         <curator.version>2.10.0</curator.version>
-        <scalamock.version>3.6.0</scalamock.version>
+        <mockito.version>1.10.19</mockito.version>
         <mysql.java.version>5.1.47</mysql.java.version>
         <cassandra.connector.version>2.4.1</cassandra.connector.version>
     </properties>
@@ -169,12 +169,16 @@
             <version>${scalatest.version}</version>
             <scope>test</scope>
         </dependency>
-
-        <!--scala mock-->
         <dependency>
-            <groupId>org.scalamock</groupId>
-            <artifactId>scalamock-scalatest-support_${scala.binary.version}</artifactId>
-            <version>${scalamock.version}</version>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <version>${mockito.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-all</artifactId>
+            <version>${mockito.version}</version>
             <scope>test</scope>
         </dependency>
 
diff --git a/measure/src/main/scala/org/apache/griffin/measure/step/builder/dsl/transform/CompletenessExpr2DQSteps.scala b/measure/src/main/scala/org/apache/griffin/measure/step/builder/dsl/transform/CompletenessExpr2DQSteps.scala
index 46def8f..f5b2581 100644
--- a/measure/src/main/scala/org/apache/griffin/measure/step/builder/dsl/transform/CompletenessExpr2DQSteps.scala
+++ b/measure/src/main/scala/org/apache/griffin/measure/step/builder/dsl/transform/CompletenessExpr2DQSteps.scala
@@ -143,6 +143,7 @@
       // 5. complete metric
       val completeTableName = ruleParam.getOutDfName()
       val completeColName = details.getStringOrKey(_complete)
+      // scalastyle:off
       val completeMetricSql = procType match {
         case BatchProcessType =>
           s"""
@@ -161,6 +162,7 @@
              |ON `${totalCountTableName}`.`${ConstantColumns.tmst}` = `${incompleteCountTableName}`.`${ConstantColumns.tmst}`
          """.stripMargin
       }
+      // scalastyle:on
       val completeWriteStep = {
         val metricOpt = ruleParam.getOutputOpt(MetricOutputType)
         val mwName = metricOpt.flatMap(_.getNameOpt).getOrElse(completeTableName)
@@ -198,31 +200,30 @@
       // only have one regular expression
       val regexValue: String = errorConf.getValues.apply(0)
       val afterReplace: String = regexValue.replaceAll("""\\""", """\\\\""")
-      val result: String = s"`${columnName}` REGEXP '${afterReplace}'"
-      return result
+      return s"(`${columnName}` REGEXP '${afterReplace}')"
     } else if ("enumeration".equalsIgnoreCase(errorType.get)) {
       val values: Seq[String] = errorConf.getValues
       var inResult = ""
       var nullResult = ""
       if (values.contains("hive_none")) {
         // hive_none means NULL
-        nullResult = s"(`${columnName}` IS NULL)"
+        nullResult = s"`${columnName}` IS NULL"
       }
 
       val valueWithQuote: String = values.filter(value => !"hive_none".equals(value))
         .map(value => s"'${value}'").mkString(", ")
 
       if (!StringUtils.isEmpty(valueWithQuote)) {
-        inResult = s"(`${columnName}` IN (${valueWithQuote}))"
+        inResult = s"`${columnName}` IN (${valueWithQuote})"
       }
 
       var result = ""
       if (!StringUtils.isEmpty(inResult) && !StringUtils.isEmpty(nullResult)) {
         result = s"(${inResult} OR ${nullResult})"
       } else if (!StringUtils.isEmpty(inResult)) {
-        result = inResult
+        result = s"($inResult)"
       } else {
-        result = nullResult
+        result = s"($nullResult)"
       }
 
       return result
diff --git a/measure/src/test/scala/org/apache/griffin/measure/step/builder/dsl/transform/CompletenessExpr2DQStepsTest.scala b/measure/src/test/scala/org/apache/griffin/measure/step/builder/dsl/transform/CompletenessExpr2DQStepsTest.scala
new file mode 100644
index 0000000..d9c5af6
--- /dev/null
+++ b/measure/src/test/scala/org/apache/griffin/measure/step/builder/dsl/transform/CompletenessExpr2DQStepsTest.scala
@@ -0,0 +1,50 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+package org.apache.griffin.measure.step.builder.dsl.transform
+
+import org.scalatest._
+import org.scalatest.mockito.MockitoSugar
+
+import org.apache.griffin.measure.configuration.dqdefinition.RuleErrorConfParam
+import org.apache.griffin.measure.configuration.dqdefinition.RuleParam
+import org.apache.griffin.measure.context.DQContext
+import org.apache.griffin.measure.step.builder.dsl.expr.Expr
+
+class CompletenessExpr2DQStepsTest extends FlatSpec with Matchers with MockitoSugar {
+
+  "CompletenessExpr2DQSteps" should "get correct where clause" in {
+    val completeness = CompletenessExpr2DQSteps(mock[DQContext], mock[Expr], mock[RuleParam])
+
+    val regexClause = completeness.getEachErrorWhereClause(
+      RuleErrorConfParam("id", "regex", List(raw"\d+")))
+    regexClause shouldBe (raw"(`id` REGEXP '\\d+')")
+
+    val enumerationClause = completeness.getEachErrorWhereClause(
+      RuleErrorConfParam("id", "enumeration", List("1", "2", "3")))
+    enumerationClause shouldBe ("(`id` IN ('1', '2', '3'))")
+
+    val noneClause = completeness.getEachErrorWhereClause(
+      RuleErrorConfParam("id", "enumeration", List("hive_none")))
+    noneClause shouldBe ("(`id` IS NULL)")
+
+    val fullClause = completeness.getEachErrorWhereClause(
+      RuleErrorConfParam("id", "enumeration", List("1", "hive_none", "3", "foo,bar")))
+    fullClause shouldBe ("(`id` IN ('1', '3', 'foo,bar') OR `id` IS NULL)")
+  }
+}