// Copyright (c) 2013, 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.

import 'dart:async';
import 'dart:convert';
import 'dart:io';

import "package:async_helper/async_helper.dart";
import "package:expect/expect.dart";

void testZLibInflate_regress10026() {
  test(data, expect) {
    asyncStart();
    var controller = new StreamController(sync: true);
    controller.stream
        .transform(zlib.decoder)
        .transform(utf8.decoder)
        .fold<StringBuffer>(new StringBuffer(), (buffer, s) {
      buffer.write(s);
      return buffer;
    }).then((out) {
      Expect.equals(out.toString(), expect);
      asyncEnd();
    });
    controller.add(data);
    controller.close();
  }

  // Generated by using 'gzip -c | od -v -tu1 -An -w12' and adding commas.
  test([
    31,
    139,
    8,
    8,
    238,
    42,
    167,
    81,
    0,
    3,
    116,
    101,
    120,
    116,
    46,
    116,
    120,
    116,
    0,
    125,
    84,
    79,
    175,
    147,
    64,
    16,
    63,
    183,
    159,
    98,
    196,
    139,
    38,
    165,
    244,
    249,
    212,
    52,
    20,
    136,
    70,
    77,
    188,
    168,
    7,
    189,
    120,
    156,
    178,
    67,
    153,
    20,
    118,
    113,
    119,
    161,
    109,
    140,
    223,
    221,
    97,
    105,
    251,
    170,
    47,
    154,
    54,
    41,
    51,
    195,
    254,
    254,
    49,
    52,
    123,
    162,
    76,
    233,
    79,
    29,
    65,
    237,
    219,
    166,
    152,
    103,
    151,
    31,
    66,
    85,
    204,
    103,
    153,
    103,
    223,
    80,
    241,
    225,
    136,
    109,
    215,
    16,
    188,
    55,
    45,
    178,
    206,
    146,
    169,
    59,
    151,
    121,
    75,
    30,
    161,
    172,
    209,
    58,
    242,
    121,
    212,
    251,
    42,
    94,
    71,
    144,
    20,
    151,
    73,
    237,
    125,
    23,
    211,
    143,
    158,
    135,
    60,
    122,
    103,
    180,
    39,
    237,
    227,
    145,
    45,
    130,
    114,
    170,
    242,
    200,
    211,
    209,
    39,
    35,
    235,
    230,
    138,
    243,
    8,
    70,
    99,
    75,
    121,
    52,
    48,
    29,
    58,
    99,
    253,
    205,
    225,
    3,
    43,
    95,
    231,
    138,
    6,
    46,
    41,
    14,
    197,
    2,
    88,
    179,
    103,
    108,
    98,
    87,
    98,
    67,
    249,
    221,
    25,
    199,
    249,
    147,
    24,
    24,
    185,
    207,
    148,
    165,
    115,
    145,
    12,
    182,
    70,
    157,
    224,
    231,
    124,
    54,
    219,
    98,
    185,
    223,
    89,
    211,
    107,
    21,
    151,
    166,
    49,
    54,
    133,
    167,
    213,
    74,
    62,
    47,
    54,
    50,
    108,
    209,
    238,
    88,
    167,
    176,
    26,
    139,
    14,
    149,
    98,
    189,
    59,
    87,
    149,
    104,
    137,
    43,
    108,
    185,
    57,
    165,
    16,
    125,
    233,
    72,
    195,
    87,
    212,
    46,
    90,
    64,
    244,
    145,
    154,
    129,
    60,
    151,
    8,
    159,
    169,
    39,
    233,
    92,
    27,
    11,
    120,
    107,
    69,
    227,
    2,
    156,
    220,
    26,
    59,
    178,
    92,
    109,
    36,
    206,
    95,
    243,
    153,
    226,
    33,
    200,
    9,
    102,
    82,
    120,
    189,
    90,
    117,
    199,
    91,
    5,
    175,
    168,
    5,
    236,
    189,
    249,
    67,
    200,
    61,
    181,
    155,
    127,
    88,
    168,
    170,
    48,
    49,
    86,
    145,
    141,
    45,
    42,
    238,
    93,
    10,
    119,
    225,
    126,
    97,
    195,
    180,
    97,
    189,
    95,
    0,
    166,
    3,
    59,
    246,
    164,
    2,
    247,
    229,
    240,
    253,
    250,
    229,
    122,
    29,
    206,
    143,
    137,
    197,
    138,
    74,
    99,
    209,
    179,
    17,
    25,
    218,
    104,
    154,
    32,
    222,
    180,
    164,
    24,
    225,
    89,
    139,
    199,
    248,
    86,
    244,
    243,
    41,
    213,
    75,
    188,
    255,
    17,
    39,
    32,
    87,
    219,
    23,
    223,
    23,
    139,
    15,
    201,
    63,
    180,
    254,
    50,
    19,
    158,
    194,
    67,
    22,
    147,
    183,
    17,
    84,
    190,
    89,
    18,
    158,
    187,
    44,
    116,
    50,
    109,
    244,
    60,
    27,
    21,
    73,
    45,
    132,
    227,
    90,
    212,
    119,
    143,
    150,
    91,
    90,
    50,
    232,
    138,
    111,
    53,
    59,
    80,
    161,
    9,
    114,
    69,
    206,
    227,
    182,
    97,
    87,
    75,
    72,
    222,
    192,
    150,
    160,
    119,
    114,
    89,
    25,
    11,
    220,
    52,
    189,
    243,
    99,
    52,
    3,
    1,
    77,
    112,
    78,
    246,
    80,
    78,
    151,
    125,
    43,
    139,
    234,
    150,
    240,
    221,
    244,
    82,
    74,
    110,
    30,
    52,
    5,
    136,
    16,
    180,
    88,
    97,
    141,
    158,
    64,
    96,
    208,
    237,
    3,
    92,
    71,
    182,
    101,
    231,
    36,
    231,
    145,
    72,
    88,
    192,
    223,
    74,
    209,
    87,
    10,
    121,
    110,
    90,
    1,
    251,
    81,
    222,
    8,
    140,
    3,
    114,
    35,
    34,
    105,
    132,
    17,
    120,
    75,
    59,
    158,
    116,
    25,
    189,
    204,
    146,
    110,
    242,
    149,
    201,
    107,
    105,
    169,
    202,
    163,
    241,
    229,
    76,
    147,
    228,
    112,
    56,
    44,
    25,
    53,
    46,
    141,
    221,
    37,
    19,
    137,
    75,
    92,
    71,
    165,
    44,
    104,
    84,
    124,
    50,
    150,
    132,
    83,
    0,
    219,
    9,
    103,
    41,
    72,
    88,
    4,
    180,
    44,
    9,
    41,
    102,
    201,
    57,
    211,
    100,
    250,
    243,
    248,
    13,
    215,
    32,
    235,
    247,
    84,
    4,
    0,
    0
  ], '''
<!doctype html>
<html>
<head>
	<title>Example Domain</title>

	<meta charset="utf-8" />
	<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />
	<style type="text/css">
	body {
		background-color: #f0f0f2;
		margin: 0;
		padding: 0;
		font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;

	}
	div {
		width: 600px;
		margin: 5em auto;
		padding: 3em;
		background-color: #fff;
		border-radius: 1em;
	}
	a:link, a:visited {
		color: #38488f;
		text-decoration: none;
	}
	@media (max-width: 600px) {
		body {
			background-color: #fff;
		}
		div {
			width: auto;
			margin: 0 auto;
			border-radius: 0;
			padding: 1em;
		}
	}
	</style>
</head>

<body>
<div>
	<h1>Example Domain</h1>
	<p>This domain is established to be used for illustrative examples in documents. You do not need to
		coordinate or ask for permission to use this domain in examples, and it is not available for
		registration.</p>
	<p><a href="http://www.iana.org/domains/special">More information...</a></p>
</div>
</body>
</html>
''');
}

void main() {
  testZLibInflate_regress10026();
}
