如何比较任意代码中的数组

问题描述 投票:0回答:1

uTest 在

utest.asserts.Asserts
中有一个 hack,可以使用
==>
比较器来比较两个数组。但是如何在任意代码中比较数组呢?

scala utest
1个回答
0
投票

您可以提供自己的

==>
比较器来检查数组已被列表替换的任意代码。当您进行涉及数组的测试时,让您的测试扩展这样的特征:

trait Array2List {

  // Allow comparing Arrays

  implicit class ArrowAssert(lhs: Any) {
    def ==>[V](rhs: V): Unit = {
      val (left, right) = (r(lhs), r(rhs))
      Predef.assert(
        left == right,
        s"""(Arrays converted to Lists)
           |Expected: $left
           |Got     : $right
           |""".stripMargin
      )
    }
  }

  // Recursively convert Arrays to Lists
  private def r(code: Any): Any = code match {
    case arr: Array[_]  => arr.toList
    case opt: Option[_] => opt.map(r)
    case seq: Seq[_]    => seq.map(r)
    case set: Set[_]    => set.map(r)
    case map: Map[_, _] => map.map { case (k, v) => (k, r(v)) }
    case tpl: Product   => tpl match {
      case Tuple1(a)                                                                 => Tuple1(a)
      case Tuple2(a, b)                                                              => Tuple2(r(a), r(b))
      case Tuple3(a, b, c)                                                           => Tuple3(r(a), r(b), r(c))
      case Tuple4(a, b, c, d)                                                        => Tuple4(r(a), r(b), r(c), r(d))
      case Tuple5(a, b, c, d, e)                                                     => Tuple5(r(a), r(b), r(c), r(d), r(e))
      case Tuple6(a, b, c, d, e, f)                                                  => Tuple6(r(a), r(b), r(c), r(d), r(e), r(f))
      case Tuple7(a, b, c, d, e, f, g)                                               => Tuple7(r(a), r(b), r(c), r(d), r(e), r(f), r(g))
      case Tuple8(a, b, c, d, e, f, g, h)                                            => Tuple8(r(a), r(b), r(c), r(d), r(e), r(f), r(g), r(h))
      case Tuple9(a, b, c, d, e, f, g, h, i)                                         => Tuple9(r(a), r(b), r(c), r(d), r(e), r(f), r(g), r(h), r(i))
      case Tuple10(a, b, c, d, e, f, g, h, i, j)                                     => Tuple10(r(a), r(b), r(c), r(d), r(e), r(f), r(g), r(h), r(i), r(j))
      case Tuple11(a, b, c, d, e, f, g, h, i, j, k)                                  => Tuple11(r(a), r(b), r(c), r(d), r(e), r(f), r(g), r(h), r(i), r(j), r(k))
      case Tuple12(a, b, c, d, e, f, g, h, i, j, k, l)                               => Tuple12(r(a), r(b), r(c), r(d), r(e), r(f), r(g), r(h), r(i), r(j), r(k), r(l))
      case Tuple13(a, b, c, d, e, f, g, h, i, j, k, l, m)                            => Tuple13(r(a), r(b), r(c), r(d), r(e), r(f), r(g), r(h), r(i), r(j), r(k), r(l), r(m))
      case Tuple14(a, b, c, d, e, f, g, h, i, j, k, l, m, n)                         => Tuple14(r(a), r(b), r(c), r(d), r(e), r(f), r(g), r(h), r(i), r(j), r(k), r(l), r(m), r(n))
      case Tuple15(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)                      => Tuple15(r(a), r(b), r(c), r(d), r(e), r(f), r(g), r(h), r(i), r(j), r(k), r(l), r(m), r(n), r(o))
      case Tuple16(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)                   => Tuple16(r(a), r(b), r(c), r(d), r(e), r(f), r(g), r(h), r(i), r(j), r(k), r(l), r(m), r(n), r(o), r(p))
      case Tuple17(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q)                => Tuple17(r(a), r(b), r(c), r(d), r(e), r(f), r(g), r(h), r(i), r(j), r(k), r(l), r(m), r(n), r(o), r(p), r(q))
      case Tuple18(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, w)             => Tuple18(r(a), r(b), r(c), r(d), r(e), r(f), r(g), r(h), r(i), r(j), r(k), r(l), r(m), r(n), r(o), r(p), r(q), r(w))
      case Tuple19(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, w, s)          => Tuple19(r(a), r(b), r(c), r(d), r(e), r(f), r(g), r(h), r(i), r(j), r(k), r(l), r(m), r(n), r(o), r(p), r(q), r(w), r(s))
      case Tuple20(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, w, s, t)       => Tuple20(r(a), r(b), r(c), r(d), r(e), r(f), r(g), r(h), r(i), r(j), r(k), r(l), r(m), r(n), r(o), r(p), r(q), r(w), r(s), r(t))
      case Tuple21(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, w, s, t, u)    => Tuple21(r(a), r(b), r(c), r(d), r(e), r(f), r(g), r(h), r(i), r(j), r(k), r(l), r(m), r(n), r(o), r(p), r(q), r(w), r(s), r(t), r(u))
      case Tuple22(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, w, s, t, u, v) => Tuple22(r(a), r(b), r(c), r(d), r(e), r(f), r(g), r(h), r(i), r(j), r(k), r(l), r(m), r(n), r(o), r(p), r(q), r(w), r(s), r(t), r(u), r(v))
      case bigger                                                                    => bigger // Scala 3
    }
    // possibly more transformations to match the data types of your test code...
    case value          => value
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.