 
   @tag apps: [:exit_sample]
   test "start points to report on exit", context do
-    Mix.Project.push ExitSample
+    Mix.Project.push(ExitSample)
+
     in_tmp context.test, fn ->
       Process.put(:application_definition, mod: {ExitApp, :bye})
-      Mix.Tasks.Compile.run []
-
-      message = "Could not start application exit_sample: exited in: " <>
-                "Mix.Tasks.App.StartTest.ExitApp.start(:normal, :bye)\n" <>
-                "    ** (EXIT) :bye"
+      Mix.Tasks.Compile.run([])
+
+      message =
+        "Could not start application exit_sample: exited in: " <>
+          "Mix.Tasks.App.StartTest.ExitApp.start(:normal, :bye)\n" <> "    ** (EXIT) :bye"
 
       assert_raise Mix.Error, message, fn ->
         Mix.Tasks.App.Start.start([app: :exit_sample], [])


  @tag apps: [:app_start_sample]
  test "compiles and starts the project" do
    Mix.Project.push AppStartSample

    in_fixture "no_mixfile", fn ->
      assert_raise Mix.Error, fn ->
        Mix.Tasks.App.Start.run ["--no-compile"]
      end

      refute List.keyfind(Application.started_applications, :logger, 0)
      Application.start(:logger)

      Mix.Tasks.App.Start.run ["--no-start"]
      assert File.regular?("_build/dev/lib/app_start_sample/ebin/Elixir.A.beam")
      assert File.regular?("_build/dev/lib/app_start_sample/ebin/app_start_sample.app")

      refute List.keyfind(Application.started_applications, :app_start_sample, 0)
      assert List.keyfind(Application.started_applications, :logger, 0)

      Mix.Tasks.App.Start.run []
      assert List.keyfind(Application.started_applications, :app_start_sample, 0)
      assert List.keyfind(Application.started_applications, :logger, 0)
    end
  end


  @tag apps: [:app_start_sample, :app_loaded_sample]
  test "start checks for invalid configuration", context do
    Mix.Project.push AppStartSample

    in_tmp context.test, fn ->
      :ok = :application.load({:application, :app_loaded_sample, [vsn: '1.0.0', env: []]})
      Mix.ProjectStack.configured_applications([:app_start_sample, :app_unknown_sample, :app_loaded_sample])

      Mix.Tasks.Compile.run([])
      Mix.Tasks.App.Start.run([])

      assert_received {:mix_shell, :error, ["You have configured application :app_unknown_sample" <> _]}
      refute_received {:mix_shell, :error, ["You have configured application :app_loaded_sample" <> _]}
    end
  end

  @tag apps: [:error]
  test "validates Elixir version requirement", context do
    Mix.ProjectStack.post_config elixir: "~> ~> 0.8.1"
    Mix.Project.push WrongElixirProject

    in_tmp context.test, fn ->
      assert_raise  Mix.Error, ~r"Invalid Elixir version requirement", fn ->
        Mix.Tasks.App.Start.run ["--no-start"]
      end
    end
  end

  @tag apps: [:error]
  test "validates the Elixir version with requirement", context do
    Mix.Project.push WrongElixirProject

    in_tmp context.test, fn ->
      assert_raise Mix.ElixirVersionError, ~r/You're trying to run :error on Elixir/, fn ->
        Mix.Tasks.App.Start.run ["--no-start"]
      end
    end
  end

  @tag apps: [:error]
  test "does not validate the Elixir version with requirement when disabled", context do
    Mix.Project.push WrongElixirProject

    in_tmp context.test, fn ->
      Mix.Tasks.App.Start.run ["--no-start", "--no-elixir-version-check"]
    end
  end


Code.require_file("../../test_helper.exs", __DIR__)

defmodule Mix.Tasks.App.StartTest do
  use MixTest.Case
