// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: script=/common/utils.js
// META: script=resources/fledge-util.sub.js
// META: timeout=long

"use strict";

promise_test(async test => {
  const uuid = generateUuid(test);
  await runReportTest(
    test, uuid,
    { generateBid:
        `return {'adCost': 1.99,
                 'bid': 9,
                 'render': interestGroup.ads[0].renderURL};`,
      reportWinSuccessCondition:
        // Possible stochastic rounding results for 1.99
        `browserSignals.adCost === 1.9921875 || browserSignals.adCost === 1.984375`,
      reportWin:
        `sendReportTo('${createBidderReportURL(uuid)}');` },
    // expectedReportURLs
    [createBidderReportURL(uuid)]
  );
}, 'Check adCost is stochastically rounded with 8 bit mantissa and exponent.');

promise_test(async test => {
  const uuid = generateUuid(test);
  await runReportTest(
    test, uuid,
    { generateBid:
        `return {'bid': 1.99,
                 'render': interestGroup.ads[0].renderURL};`,
      reportWinSuccessCondition:
        // Possible stochastic rounding results for 1.99
        `browserSignals.bid === 1.9921875 || browserSignals.bid === 1.984375`,
      reportWin:
        `sendReportTo('${createBidderReportURL(uuid)}');` },
    // expectedReportURLs
    [createBidderReportURL(uuid)]
  );
}, 'Check bid is stochastically rounded with 8 bit mantissa and exponent.');

promise_test(async test => {
  const uuid = generateUuid(test);
  await runReportTest(
    test, uuid,
    { scoreAd:
        `return {desirability: 1.99,
                 allowComponentAuction: false}`,
      reportResultSuccessCondition:
        // Possible stochastic rounding results for 1.99
        `browserSignals.desirability === 1.9921875 || browserSignals.desirability === 1.984375`,
      reportResult:
        `sendReportTo('${createBidderReportURL(uuid)}');` },
    // expectedReportURLs
    [createBidderReportURL(uuid)]
  );
}, 'Check desirability is stochastically rounded with 8 bit mantissa and exponent.');

promise_test(async test => {
  const uuid = generateUuid(test);
  await joinInterestGroup(test, uuid,
    {
      biddingLogicURL: createBiddingScriptURL({ bid: 1.99 }),
      name: 'other interest group 1' });
  await runReportTest(
    test, uuid,
    { reportResultSuccessCondition:
        // Possible stochastic rounding results for 1.99
        `browserSignals.highestScoringOtherBid === 1.9921875 || browserSignals.highestScoringOtherBid === 1.984375`,
      reportResult:
      `sendReportTo('${createBidderReportURL(uuid)}');` },
    // expectedReportURLs
    [createBidderReportURL(uuid)]
  );
}, 'Check highestScoringOtherBid is stochastically rounded with 8 bit mantissa and exponent.');

promise_test(async test => {
  const uuid = generateUuid(test);
  await runReportTest(
    test, uuid,
    { generateBid:
        `return {'adCost': 2,
                 'bid': 9,
                 'render': interestGroup.ads[0].renderURL};`,
      reportWinSuccessCondition:
        `browserSignals.adCost === 2`,
      reportWin:
        `sendReportTo('${createBidderReportURL(uuid)}');` },
    // expectedReportURLs
    [createBidderReportURL(uuid)]
  );
}, 'Value is ignored as a non-valid floating-point number.');

promise_test(async test => {
  const uuid = generateUuid(test);
  await runReportTest(
    test, uuid,
    { generateBid:
        `return {'adCost': 1E-46,
                 'bid': 9,
                 'render': interestGroup.ads[0].renderURL};`,
      reportWinSuccessCondition:
        `browserSignals.adCost === 0`,
      reportWin:
        `sendReportTo('${createBidderReportURL(uuid)}');` },
    // expectedReportURLs
    [createBidderReportURL(uuid)]
  );
}, 'Value is rounded to 0 if value is greater than 0 and its exponent is less than -128.');

promise_test(async test => {
  const uuid = generateUuid(test);
  await runReportTest(
    test, uuid,
    { generateBid:
        `return {'adCost': -1E-46,
                 'bid': 9,
                 'render': interestGroup.ads[0].renderURL};`,
      reportWinSuccessCondition:
        `browserSignals.adCost === -0`,
      reportWin:
        `sendReportTo('${createBidderReportURL(uuid)}');` },
    // expectedReportURLs
    [createBidderReportURL(uuid)]
  );
}, 'Value is rounded to -0 if value is greater than 0 and its exponent is less than -128.');

promise_test(async test => {
  const uuid = generateUuid(test);
  await runReportTest(
    test, uuid,
    { generateBid:
        `return {'adCost': 1E+39,
                 'bid': 9,
                 'render': interestGroup.ads[0].renderURL};`,
      reportWinSuccessCondition:
        `browserSignals.adCost === Infinity`,
      reportWin:
        `sendReportTo('${createBidderReportURL(uuid)}');` },
    // expectedReportURLs
    [createBidderReportURL(uuid)]
  );
}, 'Value is rounded to Infinity if value is greater than 0 and its exponent is greater than 127.');

promise_test(async test => {
  const uuid = generateUuid(test);
  await runReportTest(
    test, uuid,
    { generateBid:
        `return {'adCost': -1E+39,
                 'bid': 9,
                 'render': interestGroup.ads[0].renderURL};`,
      reportWinSuccessCondition:
        `browserSignals.adCost === -Infinity`,
      reportWin:
        `sendReportTo('${createBidderReportURL(uuid)}');` },
    // expectedReportURLs
    [createBidderReportURL(uuid)]
  );
}, 'Value is rounded to -Infinity if value is less than 0 and its exponent is greater than 127.');
