/**
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @emails oncall+react_native
 * @format
 * @flow
 */

'use strict';

import type {StackFrame} from '../../../Core/NativeExceptionsManager';

jest.mock('../../../Core/Devtools/symbolicateStackTrace');

const LogBoxSymbolication = require('../LogBoxSymbolication');

const symbolicateStackTrace: JestMockFn<
  $ReadOnlyArray<Array<StackFrame>>,
  Promise<Array<StackFrame>>,
> = (require('../../../Core/Devtools/symbolicateStackTrace'): any);

const createStack = (methodNames: Array<string>) =>
  methodNames.map(methodName => ({
    column: null,
    file: 'file://path/to/file.js',
    lineNumber: 1,
    methodName,
  }));

describe('LogBoxSymbolication', () => {
  beforeEach(() => {
    jest.resetModules();
    symbolicateStackTrace.mockImplementation(async stack => stack);
  });

  it('symbolicates different stacks', () => {
    LogBoxSymbolication.symbolicate(createStack(['A', 'B', 'C']));
    LogBoxSymbolication.symbolicate(createStack(['D', 'E', 'F']));

    expect(symbolicateStackTrace.mock.calls.length).toBe(2);
  });

  it('batch symbolicates equivalent stacks', () => {
    const stack = createStack(['A', 'B', 'C']);
    LogBoxSymbolication.symbolicate(stack);
    LogBoxSymbolication.symbolicate(stack);

    expect(symbolicateStackTrace.mock.calls.length).toBe(1);
  });
});

@@ -324,16 +324,106 @@
 anager';
+%0Aimport type %7BSymbolicatedStackTrace%7D from '../../../Core/Devtools/symbolicateStackTrace';
 %0A%0Ajest.m
@@ -628,33 +628,38 @@
 Promise%3C
-Array%3C
+Symbolicated
 Stack
-Frame%3E
+Trace
 %3E,%0A%3E = (
@@ -1052,21 +1052,61 @@
 tack =%3E 
-stack
+(%7B%0A      stack,%0A      codeFrame: null,%0A    %7D)
 );%0A  %7D);

Fix `LogBoxSymbolication-test.js`