Skip to content

Commit

Permalink
Translator: added floating point approximate assertions
Browse files Browse the repository at this point in the history
  • Loading branch information
GreyCat committed Apr 27, 2019
1 parent c862a50 commit f743186
Show file tree
Hide file tree
Showing 10 changed files with 67 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
package io.kaitai.struct.testtranslator.specgenerators

import _root_.io.kaitai.struct.datatype.DataType
import _root_.io.kaitai.struct.datatype.DataType.{ArrayType, BytesType}
import _root_.io.kaitai.struct.datatype.DataType.{ArrayType, BytesType, FloatType}
import _root_.io.kaitai.struct.exprlang.Ast
import _root_.io.kaitai.struct.testtranslator.{TestAssert, TestSpec}
import _root_.io.kaitai.struct.translators.{AbstractTranslator, TypeDetector}

abstract class BaseGenerator(spec: TestSpec) extends SpecGenerator {
val translator: AbstractTranslator with TypeDetector

val FLOAT_DELTA = "1e-6"

def header(): Unit
def footer(): Unit

def simpleAssert(check: TestAssert): Unit
def floatAssert(check: TestAssert): Unit = simpleAssert(check)
def nullAssert(actual: Ast.expr): Unit
def trueArrayAssert(check: TestAssert, elType: DataType, elts: Seq[Ast.expr]): Unit
def noAsserts(): Unit = {}
Expand All @@ -36,7 +39,13 @@ abstract class BaseGenerator(spec: TestSpec) extends SpecGenerator {
trueArrayAssert(check, at.elType, elts)
}
case _ =>
simpleAssert(check)
val actType = translator.detectType(check.actual)
actType match {
case _: FloatType =>
floatAssert(check)
case _ =>
simpleAssert(check)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,13 @@ class CSharpSG(spec: TestSpec, provider: ClassTypeProvider) extends BaseGenerato
}
}

override def floatAssert(check: TestAssert): Unit = {
val actStr = translateAct(check.actual)
val expStr = translator.translate(check.expected)
// TODO: fix order - actually it is (expected, actual)
out.puts(s"Assert.AreEqual($actStr, $expStr, $FLOAT_DELTA);")
}

override def nullAssert(actual: Ast.expr): Unit = {
val actStr = translateAct(actual)
out.puts(s"Assert.IsNull($actStr);")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@ class CppStlSG(spec: TestSpec, provider: ClassTypeProvider, cppConfig: CppRuntim
out.puts(s"BOOST_CHECK_EQUAL($actStr, $expStr);")
}

override def floatAssert(check: TestAssert): Unit = {
val actStr = translateAct(check.actual)
val expStr = translator.translate(check.expected)
out.puts(s"BOOST_CHECK_CLOSE($actStr, $expStr, $FLOAT_DELTA);")
}

def nullAssert(actual: Ast.expr): Unit = {
val nullCheckStr = actual match {
case Ast.expr.Attribute(x, Ast.identifier(attrName)) =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,13 @@ class GoSG(spec: TestSpec, provider: ClassTypeProvider) extends BaseGenerator(sp
out.puts(s"assert.EqualValues(t, $expStr, $actStr)")
}

override def floatAssert(check: TestAssert): Unit = {
val actStr = translateAct(check.actual)
val expStr = translator.translate(check.expected)
importList.add("\"github.com/stretchr/testify/assert\"")
out.puts(s"assert.InDelta(t, $expStr, $actStr, $FLOAT_DELTA)")
}

def nullAssert(actual: Ast.expr): Unit = {
importList.add("\"github.com/stretchr/testify/assert\"")
val actStr = translateAct(actual)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,12 @@ class JavaSG(spec: TestSpec, provider: ClassTypeProvider) extends BaseGenerator(
}
}

override def floatAssert(check: TestAssert): Unit = {
val actStr = translateAct(check.actual)
val expStr = translator.translate(check.expected)
out.puts(s"assertEquals($actStr, $expStr, $FLOAT_DELTA);")
}

override def nullAssert(actual: Ast.expr): Unit = {
val actStr = translateAct(actual)
out.puts(s"assertNull($actStr);")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,12 @@ class JavaScriptSG(spec: TestSpec, provider: ClassTypeProvider) extends BaseGene
}
}

override def floatAssert(check: TestAssert): Unit = {
val actStr = translateAct(check.actual)
val expStr = translator.translate(check.expected)
out.puts(s"assert(Math.abs($actStr - $expStr) < $FLOAT_DELTA);")
}

override def nullAssert(actual: Ast.expr): Unit = {
val actStr = translateAct(actual)
out.puts(s"assert.strictEqual($actStr, undefined);")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,12 @@ class PHPSG(spec: TestSpec, provider: ClassTypeProvider) extends BaseGenerator(s
out.puts(s"$$this->assertEquals($expStr, $actStr);")
}

override def floatAssert(check: TestAssert): Unit = {
val actStr = translateAct(check.actual)
val expStr = translator.translate(check.expected)
out.puts(s"$$this->assertEquals($actStr, $expStr, '', $FLOAT_DELTA);")
}

override def nullAssert(actual: Ast.expr): Unit = {
val actStr = translateAct(actual)
out.puts(s"$$this->assertEquals(null, $actStr);")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,12 @@ class PerlSG(spec: TestSpec, provider: ClassTypeProvider) extends BaseGenerator(
out.puts(s"is($actStr, $expStr, 'Equals');")
}

override def floatAssert(check: TestAssert): Unit = {
val actStr = translateAct(check.actual)
val expStr = translator.translate(check.expected)
out.puts(s"ok(abs($actStr - $expStr) < $FLOAT_DELTA, 'Approx equals');")
}

override def nullAssert(actual: Ast.expr): Unit = {
val actStr = translateAct(actual)
out.puts(s"ok(!defined($actStr), 'nil');")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@ class PythonSG(spec: TestSpec, provider: ClassTypeProvider) extends BaseGenerato
out.puts(s"self.assertEqual($actStr, $expStr)")
}

override def floatAssert(check: TestAssert): Unit = {
val actStr = translateAct(check.actual)
val expStr = translator.translate(check.expected)
out.puts(s"self.assertAlmostEqual($actStr, $expStr, 6)")
}

override def nullAssert(actual: Ast.expr): Unit = {
val actStr = translateAct(actual)
out.puts(s"self.assertIsNone($actStr)")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,12 @@ class RubySG(spec: TestSpec, provider: ClassTypeProvider) extends BaseGenerator(
out.puts(s"expect($actStr).to eq $expStr")
}

override def floatAssert(check: TestAssert): Unit = {
val actStr = translateAct(check.actual)
val expStr = translator.translate(check.expected)
out.puts(s"expect($actStr).to be_within($FLOAT_DELTA).of $expStr")
}

override def nullAssert(actual: Ast.expr): Unit = {
val actStr = translateAct(actual)
out.puts(s"expect($actStr).to be_nil")
Expand Down

0 comments on commit f743186

Please sign in to comment.