// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// @dart = 2.9

// This is a regression test for the bug in
// https://github.com/flutter/flutter/issues/89584.
// Verifies a Field::RecordStore is not done before all fields populated.

import 'dart:isolate';
import 'dart:typed_data';

void main() async {
  final receivePort = ReceivePort();
  await Isolate.spawn<SendPort>(isolateEntry, receivePort.sendPort);
  final wrapper = (await receivePort.first) as Wrapper;
  final result = readWrapperUint8ListView(wrapper);
  print(result);
}

const uint8ListLength = 1000000;

void isolateEntry(SendPort sendPort) async {
  final uint8list = Uint8List(uint8ListLength);
  sendPort.send(Wrapper(
    uint8list.buffer.asUint8List(0, uint8list.length),
  ));
}

int readWrapperUint8ListView(Wrapper wrapper) {
  var result = 0;
  for (int i = 0; i < uint8ListLength; i++) {
    result += wrapper.uint8ListView[i];
  }
  return result;
}

class Wrapper {
  final Uint8List uint8ListView;
  Wrapper(this.uint8ListView);
}
