All Downloads are FREE. Search and download functionalities are using the official Maven repository.

japgolly.scalajs.react.test.package.scala Maven / Gradle / Ivy

The newest version!
package japgolly.scalajs.react

import scala.scalajs.js
import scala.scalajs.js.{Object, UndefOr}

package object test {

  @js.native
  sealed trait ComponentClass extends Object

  @inline final implicit def autoComponentClassFromScalaComponent(c: ReactComponentC[_, _, _, _]): ComponentClass =
    c.reactClass.asInstanceOf[ComponentClass]

  final type ComponentM = ReactComponentM_[TopNode]

  @js.native
  sealed trait ReactOrDomNode extends Object

  @inline final implicit def autoReactOrDomNodeN(n: TopNode): ReactOrDomNode =
    n.asInstanceOf[ReactOrDomNode]
  @inline final implicit def autoReactOrDomNodeU(c: ReactElement): ReactOrDomNode =
    c.asInstanceOf[ReactOrDomNode]
  @inline final implicit def autoReactOrDomNodeM[N <: TopNode](c: ReactComponentM_[N]): ReactOrDomNode =
    autoReactOrDomNodeN(ReactDOM findDOMNode c)

  @inline final implicit def RTUSChangeEventData  (d: ChangeEventData  ): Object = d.toJs
  @inline final implicit def RTUSKeyboardEventData(d: KeyboardEventData): Object = d.toJs
  @inline final implicit def RTUSMouseEventData   (d: MouseEventData   ): Object = d.toJs

  @inline final implicit def autoUnboxRefsInTests[T <: TopNode](r: UndefOr[ReactComponentM_[T]]) = r.get
  @inline final implicit def autoUnboxRefsInTestsC[T <: TopNode](r: UndefOr[ReactComponentM_[T]]): ReactOrDomNode = r.get

//  implicit final class RTUSimulateExt(private val u: Simulate) extends AnyVal {
//    def change(t: ReactOrDomNode, newValue: String) = u.change(t, ChangeEventData(value = newValue))
//  }

  private val reactDataAttrRegex = """\s+data-react\S*?\s*?=\s*?".*?"""".r

  implicit class ReactTestUtilsScalaExt(private val * : ReactTestUtils) extends AnyVal {
    def withRenderedIntoDocument[A](c: ReactElement)(f: ComponentM => A): A =
      _withRenderedIntoDocument(c)(* renderIntoDocument _)(_.getDOMNode(), f)

    def withRenderedIntoDocument[P,S,B,N <: TopNode, A](c: ReactComponentU[P,S,B,N])(f: ReactComponentM[P,S,B,N] => A): A =
      _withRenderedIntoDocument(c)(* renderIntoDocument _)(_.getDOMNode(), f)


    /**
      * Turn `<div data-reactroot="">hello</div>`
      * into `<div>hello</div>`
      */
    def removeReactDataAttr(html: String): String =
      reactDataAttrRegex.replaceAllIn(html, "")
  }

  private def _withRenderedIntoDocument[A, B, C](a: A)(f: A => B)(n: B => TopNode, g: B => C): C = {
    val b = f(a)
    try
      g(b)
    finally
      ReactDOM unmountComponentAtNode n(b).parentNode
  }

  @inline implicit final class ReactTestExt_Mounted[N <: TopNode](private val c: CompScope.Mounted[N]) extends AnyVal {
    def outerHtmlWithoutReactDataAttr(): String =
      ReactTestUtils removeReactDataAttr c.getDOMNode().outerHTML
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy