toBeVisible( actual, expected, source ) {
        const renderDetails = ( actual ) => actual.isAvailable ? `[display: ${ actual.display }, `
              + `visibility: ${ actual.visibility }, opacity: ${ actual.opacity }, `
              + `offset: ${ actual.isIntersecting ? "within viewport" : "out of viewport" }]`
              : `[ not available ]`;

        switch ( true ) {

          case actual.isAvailable === false && expected.availability === "available":
            // early exist, makes no sense to proceed
            return expectReturn( false, `[${ source }] expected the target element to be `
              + `available, but it is not` );

          case actual.isAvailable === true && expected.availability === "unavailable":
            // early exist, makes no sense to proceed
            return expectReturn( false, `[${ source }] expected the target element to be `
              + `not available, but it is` );

          case expected.availability === "visible"
            && (
              actual.isAvailable === false
              || actual.display === "none"
              || actual.visibility === "hidden"
              || actual.opacity === 0
              || !actual.isIntersecting
            ):
            return expectReturn( false, `[${ source }] expected the target element to be `
              + `available and observable, but it is not ${ renderDetails( actual ) }`);

          case expected.availability === "invisible" && actual.isAvailable === true:
            if ( actual.display === "none"
              || actual.visibility === "hidden"
              || actual.opacity === 0
              || !actual.isIntersecting ) {
              return expectReturn( true, `[${ source }] expected the target element to be `
              + `available and not observable, but it is` );
            }
            return expectReturn( false, `[${ source }] expected the target element to be `
              + `available and not observable, but it is ${ renderDetails( actual ) }` );

          case actual.display === "none" && expected.display === "not":
            return expectReturn( false, `[${ source }] expected the target element to have `
              + `display NOT none, but it is none` );

          case actual.display !== "none" && expected.display === "none":
            return expectReturn( false, `[${ source }] expected the target element to have `
              + `display none, but it is ${ actual.display }` );

          case  actual.visibility === "hidden" && expected.visibility === "not":
            return expectReturn( false, `[${ source }] expected the target element to have `
              + `visibility NOT hidden, but it is hidden` );

          case actual.visibility !== "hidden" && expected.visibility === "hidden":
            return expectReturn( false, `[${ source }] expected the target element to have `
              + `visibility hidden, but it is ${ actual.visibility }` );

          case actual.opacity === 0 && expected.opacity === "not":
            return expectReturn( false, `[${ source }] expected the target element to have `
              + `opacity > 0, but it is 0` );

          case actual.opacity !== 0 && expected.opacity === "0":
            return expectReturn( false, `[${ source }] expected the target element to have `
              + `opacity 0, but it is ${ actual.opacity }` );

          case actual.isIntersecting !== true && expected.isIntersecting === "true":
            return expectReturn( false, `[${ source }] expected the target element to be `
              + `within the viewport, but it is not` );

          case actual.isIntersecting === true && expected.isIntersecting === "false":
            return expectReturn( false, `[${ source }] expected the target element to be `
              + `out of the viewport, but it is not` );
        }

        // everything fine
        return expectReturn( true, `[${ source }] expected the target element to be `
            + `available, but it is not` );

    }
@param {Object} actual
@param {Object} expected
@param {String} source
@returns {Object}