// Copyright (c) 2019, 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 'package:analysis_server/src/services/correction/assist.dart';
import 'package:analysis_server/src/services/linter/lint_names.dart';
import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer_plugin/utilities/assist/assist.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import 'assist_processor.dart';

main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(ConvertToIfElementTest);
  });
}

@reflectiveTest
class ConvertToIfElementTest extends AssistProcessorTest {
  @override
  AssistKind get kind => DartAssistKind.CONVERT_TO_IF_ELEMENT;

  void setUp() {
    createAnalysisOptionsFile(
        experiments: [EnableString.control_flow_collections]);
    super.setUp();
  }

  test_conditional_list() async {
    await resolveTestUnit('''
f(bool b) {
  return ['a', b /*caret*/? 'c' : 'd', 'e'];
}
''');
    await assertHasAssist('''
f(bool b) {
  return ['a', if (b) 'c' else 'd', 'e'];
}
''');
  }

  test_conditional_list_caret_at_start_of_expression() async {
    await resolveTestUnit('''
f(bool b) {
  return ['a', /*caret*/b ? 'c' : 'd', 'e'];
}
''');
    await assertHasAssist('''
f(bool b) {
  return ['a', if (b) 'c' else 'd', 'e'];
}
''');
  }

  test_conditional_list_noAssistWithLint() async {
    createAnalysisOptionsFile(
        lints: [LintNames.prefer_if_elements_to_conditional_expressions]);
    verifyNoTestUnitErrors = false;
    await resolveTestUnit('''
f(bool b) {
  return ['a', b /*caret*/? 'c' : 'd', 'e'];
}
''');
    await assertNoAssist();
  }

  test_conditional_list_withParentheses() async {
    await resolveTestUnit('''
f(bool b) {
  return ['a', (b /*caret*/? 'c' : 'd'), 'e'];
}
''');
    await assertHasAssist('''
f(bool b) {
  return ['a', if (b) 'c' else 'd', 'e'];
}
''');
  }

  test_conditional_map() async {
    await resolveTestUnit('''
f(bool b) {
  return {'a' : 1, b /*caret*/? 'c' : 'd' : 2, 'e' : 3};
}
''');
    await assertNoAssist();
  }

  test_conditional_notConditional() async {
    await resolveTestUnit('''
f(bool b) {
  return {'/*caret*/a', b ? 'c' : 'd', 'e'};
}
''');
    await assertNoAssist();
  }

  test_conditional_notInLiteral() async {
    await resolveTestUnit('''
f(bool b) {
  return b /*caret*/? 'c' : 'd';
}
''');
    await assertNoAssist();
  }

  test_conditional_set() async {
    await resolveTestUnit('''
f(bool b) {
  return {'a', b /*caret*/? 'c' : 'd', 'e'};
}
''');
    await assertHasAssist('''
f(bool b) {
  return {'a', if (b) 'c' else 'd', 'e'};
}
''');
  }

  test_conditional_set_withParentheses() async {
    await resolveTestUnit('''
f(bool b) {
  return {'a', ((b /*caret*/? 'c' : 'd')), 'e'};
}
''');
    await assertHasAssist('''
f(bool b) {
  return {'a', if (b) 'c' else 'd', 'e'};
}
''');
  }
}
