diff --git a/Library/Homebrew/test/integration_cmds_tests.rb b/Library/Homebrew/test/integration_cmds_tests.rb
new file mode 100644
index 0000000000000000000000000000000000000000..a63b343c0303f24a49866258b5e6279bae8475da
--- /dev/null
+++ b/Library/Homebrew/test/integration_cmds_tests.rb
@@ -0,0 +1,194 @@
+require "bundler"
+require "testing_env"
+require "fileutils"
+require "pathname"
+require "formula"
+
+class IntegrationCommandTests < Homebrew::TestCase
+  def setup
+    @cmd_id_index = 0 # Assign unique IDs to invocations of `cmd_output`.
+    (HOMEBREW_PREFIX/"bin").mkpath
+    FileUtils.touch HOMEBREW_PREFIX/"bin/brew"
+  end
+
+  def teardown
+    coretap = CoreTap.new
+    paths_to_delete = [
+      HOMEBREW_LINKED_KEGS,
+      HOMEBREW_PINNED_KEGS,
+      HOMEBREW_CELLAR.children,
+      HOMEBREW_CACHE.children,
+      HOMEBREW_LOCK_DIR.children,
+      HOMEBREW_LOGS.children,
+      HOMEBREW_TEMP.children,
+      HOMEBREW_PREFIX/"bin",
+      HOMEBREW_PREFIX/"share",
+      HOMEBREW_PREFIX/"opt",
+      HOMEBREW_LIBRARY/"Taps/caskroom",
+      HOMEBREW_LIBRARY/"Taps/homebrew/homebrew-bundle",
+      HOMEBREW_LIBRARY/"Taps/homebrew/homebrew-foo",
+      HOMEBREW_LIBRARY/"Taps/homebrew/homebrew-services",
+      HOMEBREW_LIBRARY/"Taps/homebrew/homebrew-shallow",
+      HOMEBREW_REPOSITORY/".git",
+      coretap.path/".git",
+      coretap.alias_dir,
+      coretap.formula_dir.children,
+      coretap.path/"formula_renames.json",
+    ].flatten
+    FileUtils.rm_rf paths_to_delete
+  end
+
+  def needs_test_cmd_taps
+    return if ENV["HOMEBREW_TEST_OFFICIAL_CMD_TAPS"]
+    skip "HOMEBREW_TEST_OFFICIAL_CMD_TAPS is not set"
+  end
+
+  def needs_macos
+    skip "Not on MacOS" unless OS.mac?
+  end
+
+  def cmd_id_from_args(args)
+    args_pretty = args.join(" ").gsub(TEST_TMPDIR, "@TMPDIR@")
+    test_pretty = "#{self.class.name}\##{name}.#{@cmd_id_index += 1}"
+    "[#{test_pretty}] brew #{args_pretty}"
+  end
+
+  def cmd_output(*args)
+    # 1.8-compatible way of writing def cmd_output(*args, **env)
+    env = args.last.is_a?(Hash) ? args.pop : {}
+    cmd_args = %W[
+      -W0
+      -I#{HOMEBREW_LIBRARY_PATH}/test/lib
+      -rconfig
+    ]
+    if ENV["HOMEBREW_TESTS_COVERAGE"]
+      # This is needed only because we currently use a patched version of
+      # simplecov, and gems installed through git are not available without
+      # requiring bundler/setup first. See also the comment in test/Gemfile.
+      # Remove this line when we'll switch back to a stable simplecov release.
+      cmd_args << "-rbundler/setup"
+      cmd_args << "-rsimplecov"
+    end
+    cmd_args << "-rintegration_mocks"
+    cmd_args << (HOMEBREW_LIBRARY_PATH/"brew.rb").resolved_path.to_s
+    cmd_args += args
+    Bundler.with_original_env do
+      ENV["HOMEBREW_BREW_FILE"] = HOMEBREW_PREFIX/"bin/brew"
+      ENV["HOMEBREW_INTEGRATION_TEST"] = cmd_id_from_args(args)
+      ENV["HOMEBREW_TEST_TMPDIR"] = TEST_TMPDIR
+      env.each_pair { |k, v| ENV[k] = v }
+
+      read, write = IO.pipe
+      begin
+        pid = fork do
+          read.close
+          $stdout.reopen(write)
+          $stderr.reopen(write)
+          write.close
+          exec RUBY_PATH, *cmd_args
+        end
+        write.close
+        read.read.chomp
+      ensure
+        Process.wait(pid)
+        read.close
+      end
+    end
+  end
+
+  def cmd(*args)
+    output = cmd_output(*args)
+    status = $?.exitstatus
+    puts "\n#{output}" if status.nonzero?
+    assert_equal 0, status
+    output
+  end
+
+  def cmd_fail(*args)
+    output = cmd_output(*args)
+    status = $?.exitstatus
+    $stderr.puts "\n#{output}" if status.zero?
+    refute_equal 0, status
+    output
+  end
+
+  def setup_test_formula(name, content = nil)
+    formula_path = CoreTap.new.formula_dir/"#{name}.rb"
+
+    case name
+    when /^testball/
+      content = <<-EOS.undent
+        desc "Some test"
+        homepage "https://example.com/#{name}"
+        url "file://#{File.expand_path("..", __FILE__)}/tarballs/testball-0.1.tbz"
+        sha256 "#{TESTBALL_SHA256}"
+
+        option "with-foo", "Build with foo"
+        #{content}
+
+        def install
+          (prefix/"foo"/"test").write("test") if build.with? "foo"
+          prefix.install Dir["*"]
+          (buildpath/"test.c").write \
+            "#include <stdio.h>\\nint main(){return printf(\\"test\\");}"
+          bin.mkpath
+          system ENV.cc, "test.c", "-o", bin/"test"
+        end
+
+        # something here
+      EOS
+    when "foo"
+      content = <<-EOS.undent
+        url "https://example.com/#{name}-1.0"
+      EOS
+    when "bar"
+      content = <<-EOS.undent
+        url "https://example.com/#{name}-1.0"
+        depends_on "foo"
+      EOS
+    end
+
+    formula_path.write <<-EOS.undent
+      class #{Formulary.class_s(name)} < Formula
+        #{content}
+      end
+    EOS
+
+    formula_path
+  end
+
+  def setup_remote_tap(name)
+    tap = Tap.fetch name
+    tap.install(full_clone: false, quiet: true) unless tap.installed?
+    tap
+  end
+
+  def install_and_rename_coretap_formula(old_name, new_name)
+    core_tap = CoreTap.new
+    core_tap.path.cd do
+      shutup do
+        system "git", "init"
+        system "git", "add", "--all"
+        system "git", "commit", "-m",
+          "#{old_name.capitalize} has not yet been renamed"
+      end
+    end
+
+    cmd("install", old_name)
+    (core_tap.path/"Formula/#{old_name}.rb").unlink
+    formula_renames = core_tap.path/"formula_renames.json"
+    formula_renames.write Utils::JSON.dump(old_name => new_name)
+
+    core_tap.path.cd do
+      shutup do
+        system "git", "add", "--all"
+        system "git", "commit", "-m",
+          "#{old_name.capitalize} has been renamed to #{new_name.capitalize}"
+      end
+    end
+  end
+
+  def testball
+    "#{File.expand_path("..", __FILE__)}/testball.rb"
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds.rb b/Library/Homebrew/test/test_integration_cmds.rb
deleted file mode 100644
index 35ad04e7a624383c08705dacfd1252ccc9f3cb5d..0000000000000000000000000000000000000000
--- a/Library/Homebrew/test/test_integration_cmds.rb
+++ /dev/null
@@ -1,899 +0,0 @@
-require "bundler"
-require "testing_env"
-require "fileutils"
-require "pathname"
-require "formula"
-
-class IntegrationCommandTests < Homebrew::TestCase
-  def setup
-    @cmd_id_index = 0 # Assign unique IDs to invocations of `cmd_output`.
-    (HOMEBREW_PREFIX/"bin").mkpath
-    FileUtils.touch HOMEBREW_PREFIX/"bin/brew"
-  end
-
-  def teardown
-    coretap = CoreTap.new
-    paths_to_delete = [
-      HOMEBREW_LINKED_KEGS,
-      HOMEBREW_PINNED_KEGS,
-      HOMEBREW_CELLAR.children,
-      HOMEBREW_CACHE.children,
-      HOMEBREW_LOCK_DIR.children,
-      HOMEBREW_LOGS.children,
-      HOMEBREW_TEMP.children,
-      HOMEBREW_PREFIX/"bin",
-      HOMEBREW_PREFIX/"share",
-      HOMEBREW_PREFIX/"opt",
-      HOMEBREW_LIBRARY/"Taps/caskroom",
-      HOMEBREW_LIBRARY/"Taps/homebrew/homebrew-bundle",
-      HOMEBREW_LIBRARY/"Taps/homebrew/homebrew-foo",
-      HOMEBREW_LIBRARY/"Taps/homebrew/homebrew-services",
-      HOMEBREW_LIBRARY/"Taps/homebrew/homebrew-shallow",
-      HOMEBREW_REPOSITORY/".git",
-      coretap.path/".git",
-      coretap.alias_dir,
-      coretap.formula_dir.children,
-      coretap.path/"formula_renames.json",
-    ].flatten
-    FileUtils.rm_rf paths_to_delete
-  end
-
-  def needs_test_cmd_taps
-    return if ENV["HOMEBREW_TEST_OFFICIAL_CMD_TAPS"]
-    skip "HOMEBREW_TEST_OFFICIAL_CMD_TAPS is not set"
-  end
-
-  def needs_macos
-    skip "Not on MacOS" unless OS.mac?
-  end
-
-  def cmd_id_from_args(args)
-    args_pretty = args.join(" ").gsub(TEST_TMPDIR, "@TMPDIR@")
-    test_pretty = "#{self.class.name}\##{name}.#{@cmd_id_index += 1}"
-    "[#{test_pretty}] brew #{args_pretty}"
-  end
-
-  def cmd_output(*args)
-    # 1.8-compatible way of writing def cmd_output(*args, **env)
-    env = args.last.is_a?(Hash) ? args.pop : {}
-    cmd_args = %W[
-      -W0
-      -I#{HOMEBREW_LIBRARY_PATH}/test/lib
-      -rconfig
-    ]
-    if ENV["HOMEBREW_TESTS_COVERAGE"]
-      # This is needed only because we currently use a patched version of
-      # simplecov, and gems installed through git are not available without
-      # requiring bundler/setup first. See also the comment in test/Gemfile.
-      # Remove this line when we'll switch back to a stable simplecov release.
-      cmd_args << "-rbundler/setup"
-      cmd_args << "-rsimplecov"
-    end
-    cmd_args << "-rintegration_mocks"
-    cmd_args << (HOMEBREW_LIBRARY_PATH/"brew.rb").resolved_path.to_s
-    cmd_args += args
-    Bundler.with_original_env do
-      ENV["HOMEBREW_BREW_FILE"] = HOMEBREW_PREFIX/"bin/brew"
-      ENV["HOMEBREW_INTEGRATION_TEST"] = cmd_id_from_args(args)
-      ENV["HOMEBREW_TEST_TMPDIR"] = TEST_TMPDIR
-      env.each_pair { |k, v| ENV[k] = v }
-
-      read, write = IO.pipe
-      begin
-        pid = fork do
-          read.close
-          $stdout.reopen(write)
-          $stderr.reopen(write)
-          write.close
-          exec RUBY_PATH, *cmd_args
-        end
-        write.close
-        read.read.chomp
-      ensure
-        Process.wait(pid)
-        read.close
-      end
-    end
-  end
-
-  def cmd(*args)
-    output = cmd_output(*args)
-    status = $?.exitstatus
-    puts "\n#{output}" if status.nonzero?
-    assert_equal 0, status
-    output
-  end
-
-  def cmd_fail(*args)
-    output = cmd_output(*args)
-    status = $?.exitstatus
-    $stderr.puts "\n#{output}" if status.zero?
-    refute_equal 0, status
-    output
-  end
-
-  def setup_test_formula(name, content = nil)
-    formula_path = CoreTap.new.formula_dir/"#{name}.rb"
-
-    case name
-    when /^testball/
-      content = <<-EOS.undent
-        desc "Some test"
-        homepage "https://example.com/#{name}"
-        url "file://#{File.expand_path("..", __FILE__)}/tarballs/testball-0.1.tbz"
-        sha256 "#{TESTBALL_SHA256}"
-
-        option "with-foo", "Build with foo"
-        #{content}
-
-        def install
-          (prefix/"foo"/"test").write("test") if build.with? "foo"
-          prefix.install Dir["*"]
-          (buildpath/"test.c").write \
-            "#include <stdio.h>\\nint main(){return printf(\\"test\\");}"
-          bin.mkpath
-          system ENV.cc, "test.c", "-o", bin/"test"
-        end
-
-        # something here
-      EOS
-    when "foo"
-      content = <<-EOS.undent
-        url "https://example.com/#{name}-1.0"
-      EOS
-    when "bar"
-      content = <<-EOS.undent
-        url "https://example.com/#{name}-1.0"
-        depends_on "foo"
-      EOS
-    end
-
-    formula_path.write <<-EOS.undent
-      class #{Formulary.class_s(name)} < Formula
-        #{content}
-      end
-    EOS
-
-    formula_path
-  end
-
-  def setup_remote_tap(name)
-    tap = Tap.fetch name
-    tap.install(full_clone: false, quiet: true) unless tap.installed?
-    tap
-  end
-
-  def install_and_rename_coretap_formula(old_name, new_name)
-    core_tap = CoreTap.new
-    core_tap.path.cd do
-      shutup do
-        system "git", "init"
-        system "git", "add", "--all"
-        system "git", "commit", "-m",
-          "#{old_name.capitalize} has not yet been renamed"
-      end
-    end
-
-    cmd("install", old_name)
-    (core_tap.path/"Formula/#{old_name}.rb").unlink
-    formula_renames = core_tap.path/"formula_renames.json"
-    formula_renames.write Utils::JSON.dump(old_name => new_name)
-
-    core_tap.path.cd do
-      shutup do
-        system "git", "add", "--all"
-        system "git", "commit", "-m",
-          "#{old_name.capitalize} has been renamed to #{new_name.capitalize}"
-      end
-    end
-  end
-
-  def testball
-    "#{File.expand_path("..", __FILE__)}/testball.rb"
-  end
-
-  def test_prefix
-    assert_equal HOMEBREW_PREFIX.to_s,
-                 cmd("--prefix")
-  end
-
-  def test_version
-    assert_match HOMEBREW_VERSION.to_s,
-                 cmd("--version")
-  end
-
-  def test_cache
-    assert_equal HOMEBREW_CACHE.to_s,
-                 cmd("--cache")
-  end
-
-  def test_cache_formula
-    assert_match %r{#{HOMEBREW_CACHE}/testball-},
-                 cmd("--cache", testball)
-  end
-
-  def test_cellar
-    assert_equal HOMEBREW_CELLAR.to_s,
-                 cmd("--cellar")
-  end
-
-  def test_cellar_formula
-    assert_match "#{HOMEBREW_CELLAR}/testball",
-                 cmd("--cellar", testball)
-  end
-
-  def test_env
-    assert_match(/CMAKE_PREFIX_PATH="#{Regexp.escape(HOMEBREW_PREFIX)}[:"]/,
-                 cmd("--env"))
-  end
-
-  def test_env_bash
-    assert_match(/export CMAKE_PREFIX_PATH="#{Regexp.quote(HOMEBREW_PREFIX.to_s)}"/,
-                 cmd("--env", "--shell=bash"))
-  end
-
-  def test_env_fish
-    assert_match(/set [-]gx CMAKE_PREFIX_PATH "#{Regexp.quote(HOMEBREW_PREFIX.to_s)}"/,
-                 cmd("--env", "--shell=fish"))
-  end
-
-  def test_env_csh
-    assert_match(/setenv CMAKE_PREFIX_PATH #{Regexp.quote(HOMEBREW_PREFIX.to_s)};/,
-                 cmd("--env", "--shell=tcsh"))
-  end
-
-  def test_env_plain
-    assert_match(/CMAKE_PREFIX_PATH: #{Regexp.quote(HOMEBREW_PREFIX)}/,
-                 cmd("--env", "--plain"))
-  end
-
-  def test_prefix_formula
-    assert_match "#{HOMEBREW_CELLAR}/testball",
-                 cmd("--prefix", testball)
-  end
-
-  def test_repository
-    assert_match HOMEBREW_REPOSITORY.to_s,
-                 cmd("--repository")
-    assert_match "#{HOMEBREW_LIBRARY}/Taps/foo/homebrew-bar",
-                 cmd("--repository", "foo/bar")
-  end
-
-  def test_help
-    assert_match "Example usage:\n",
-                 cmd_fail # Generic help (empty argument list).
-    assert_match "Unknown command: command-that-does-not-exist",
-                 cmd_fail("help", "command-that-does-not-exist")
-    assert_match(/^brew cat /,
-                 cmd_fail("cat")) # Missing formula argument triggers help.
-
-    assert_match "Example usage:\n",
-                 cmd("help") # Generic help.
-    assert_match(/^brew cat /,
-                 cmd("help", "cat")) # Internal command (documented, Ruby).
-    assert_match(/^brew update /,
-                 cmd("help", "update")) # Internal command (documented, Shell).
-    assert_match(/^brew update-test /,
-                 cmd("help", "update-test")) # Internal developer command (documented, Ruby).
-  end
-
-  def test_config
-    assert_match "HOMEBREW_VERSION: #{HOMEBREW_VERSION}",
-                 cmd("config")
-  end
-
-  def test_install
-    setup_test_formula "testball1"
-    assert_match "Specify `--HEAD`", cmd_fail("install", "testball1", "--head")
-    assert_match "No head is defined", cmd_fail("install", "testball1", "--HEAD")
-    assert_match "No devel block", cmd_fail("install", "testball1", "--devel")
-    assert_match "#{HOMEBREW_CELLAR}/testball1/0.1", cmd("install", "testball1")
-    assert_match "testball1-0.1 already installed", cmd("install", "testball1")
-    assert_match "MacRuby is not packaged", cmd_fail("install", "macruby")
-    assert_match "No available formula", cmd_fail("install", "formula")
-    assert_match "This similarly named formula was found",
-      cmd_fail("install", "testball")
-
-    setup_test_formula "testball2"
-    assert_match "These similarly named formulae were found",
-      cmd_fail("install", "testball")
-
-    install_and_rename_coretap_formula "testball1", "testball2"
-    assert_match "testball1 already installed, it's just not migrated",
-      cmd("install", "testball2")
-  end
-
-  def test_bottle
-    cmd("install", "--build-bottle", testball)
-    assert_match "Formula not from core or any taps",
-                 cmd_fail("bottle", "--no-rebuild", testball)
-
-    setup_test_formula "testball"
-
-    # `brew bottle` should not fail with dead symlink
-    # https://github.com/Homebrew/legacy-homebrew/issues/49007
-    (HOMEBREW_CELLAR/"testball/0.1").cd do
-      FileUtils.ln_s "not-exist", "symlink"
-    end
-    assert_match(/testball-0\.1.*\.bottle\.tar\.gz/,
-                  cmd_output("bottle", "--no-rebuild", "testball"))
-  ensure
-    FileUtils.rm_f Dir["testball-0.1*.bottle.tar.gz"]
-  end
-
-  def test_uninstall
-    cmd("install", testball)
-    assert_match "Uninstalling testball", cmd("uninstall", "--force", testball)
-  end
-
-  def test_cleanup
-    (HOMEBREW_CACHE/"test").write "test"
-    assert_match "#{HOMEBREW_CACHE}/test", cmd("cleanup", "--prune=all")
-  end
-
-  def test_readall
-    formula_file = setup_test_formula "testball"
-    alias_file = CoreTap.new.alias_dir/"foobar"
-    alias_file.parent.mkpath
-    FileUtils.ln_s formula_file, alias_file
-    cmd("readall", "--aliases", "--syntax")
-    cmd("readall", "homebrew/core")
-  end
-
-  def test_tap
-    path = Tap::TAP_DIRECTORY/"homebrew/homebrew-foo"
-    path.mkpath
-    path.cd do
-      shutup do
-        system "git", "init"
-        system "git", "remote", "add", "origin", "https://github.com/Homebrew/homebrew-foo"
-        FileUtils.touch "readme"
-        system "git", "add", "--all"
-        system "git", "commit", "-m", "init"
-      end
-    end
-
-    assert_match "homebrew/foo", cmd("tap")
-    assert_match "homebrew/versions", cmd("tap", "--list-official")
-    assert_match "2 taps", cmd("tap-info")
-    assert_match "https://github.com/Homebrew/homebrew-foo", cmd("tap-info", "homebrew/foo")
-    assert_match "https://github.com/Homebrew/homebrew-foo", cmd("tap-info", "--json=v1", "--installed")
-    assert_match "Pinned homebrew/foo", cmd("tap-pin", "homebrew/foo")
-    assert_match "homebrew/foo", cmd("tap", "--list-pinned")
-    assert_match "Unpinned homebrew/foo", cmd("tap-unpin", "homebrew/foo")
-    assert_match "Tapped", cmd("tap", "homebrew/bar", path/".git")
-    assert_match "Untapped", cmd("untap", "homebrew/bar")
-    assert_equal "", cmd("tap", "homebrew/bar", path/".git", "-q", "--full")
-    assert_match "Untapped", cmd("untap", "homebrew/bar")
-  end
-
-  def test_missing
-    setup_test_formula "foo"
-    setup_test_formula "bar"
-
-    (HOMEBREW_CELLAR/"bar/1.0").mkpath
-    assert_match "foo", cmd("missing")
-  end
-
-  def test_doctor
-    assert_match "This is an integration test",
-                 cmd_fail("doctor", "check_integration_test")
-  end
-
-  def test_command
-    assert_equal "#{HOMEBREW_LIBRARY_PATH}/cmd/info.rb",
-                 cmd("command", "info")
-
-    assert_match "Unknown command",
-                 cmd_fail("command", "I-don't-exist")
-  end
-
-  def test_commands
-    assert_match "Built-in commands",
-                 cmd("commands")
-  end
-
-  def test_cat
-    formula_file = setup_test_formula "testball"
-    assert_equal formula_file.read.chomp, cmd("cat", "testball")
-  end
-
-  def test_desc
-    setup_test_formula "testball"
-
-    assert_equal "testball: Some test", cmd("desc", "testball")
-    assert_match "Pick one, and only one", cmd_fail("desc", "--search", "--name")
-    assert_match "You must provide a search term", cmd_fail("desc", "--search")
-
-    desc_cache = HOMEBREW_CACHE/"desc_cache.json"
-    refute_predicate desc_cache, :exist?, "Cached file should not exist"
-
-    cmd("desc", "--description", "testball")
-    assert_predicate desc_cache, :exist?, "Cached file should not exist"
-  end
-
-  def test_edit
-    (HOMEBREW_REPOSITORY/".git").mkpath
-    setup_test_formula "testball"
-
-    assert_match "# something here",
-                 cmd("edit", "testball", "HOMEBREW_EDITOR" => "/bin/cat")
-  end
-
-  def test_sh
-    assert_match "Your shell has been configured",
-                 cmd("sh", "SHELL" => which("true"))
-  end
-
-  def test_info
-    setup_test_formula "testball"
-
-    assert_match "testball: stable 0.1",
-                 cmd("info", "testball")
-  end
-
-  def test_tap_readme
-    assert_match "brew install homebrew/foo/<formula>",
-                 cmd("tap-readme", "foo", "--verbose")
-    readme = HOMEBREW_LIBRARY/"Taps/homebrew/homebrew-foo/README.md"
-    assert readme.exist?, "The README should be created"
-  end
-
-  def test_unpack
-    setup_test_formula "testball"
-
-    mktmpdir do |path|
-      cmd "unpack", "testball", "--destdir=#{path}"
-      assert File.directory?("#{path}/testball-0.1"),
-        "The tarball should be unpacked"
-    end
-  end
-
-  def test_options
-    setup_test_formula "testball", <<-EOS.undent
-      depends_on "bar" => :recommended
-    EOS
-
-    assert_equal "--with-foo\n\tBuild with foo\n--without-bar\n\tBuild without bar support",
-      cmd_output("options", "testball").chomp
-  end
-
-  def test_outdated
-    setup_test_formula "testball"
-    (HOMEBREW_CELLAR/"testball/0.0.1/foo").mkpath
-
-    assert_equal "testball", cmd("outdated")
-  end
-
-  def test_upgrade
-    setup_test_formula "testball"
-    (HOMEBREW_CELLAR/"testball/0.0.1/foo").mkpath
-
-    cmd("upgrade")
-    assert((HOMEBREW_CELLAR/"testball/0.1").directory?,
-      "The latest version directory should be created")
-  end
-
-  def test_linkapps
-    home_dir = Pathname.new(mktmpdir)
-    (home_dir/"Applications").mkpath
-
-    setup_test_formula "testball"
-
-    source_dir = HOMEBREW_CELLAR/"testball/0.1/TestBall.app"
-    source_dir.mkpath
-    assert_match "Linking: #{source_dir}",
-      cmd("linkapps", "--local", "HOME" => home_dir)
-  end
-
-  def test_unlinkapps
-    home_dir = Pathname.new(mktmpdir)
-    apps_dir = home_dir/"Applications"
-    apps_dir.mkpath
-
-    setup_test_formula "testball"
-
-    source_app = (HOMEBREW_CELLAR/"testball/0.1/TestBall.app")
-    source_app.mkpath
-
-    FileUtils.ln_s source_app, "#{apps_dir}/TestBall.app"
-
-    assert_match "Unlinking: #{apps_dir}/TestBall.app",
-      cmd("unlinkapps", "--local", "HOME" => home_dir)
-  end
-
-  def test_pin_unpin
-    setup_test_formula "testball"
-    (HOMEBREW_CELLAR/"testball/0.0.1/foo").mkpath
-
-    cmd("pin", "testball")
-    cmd("upgrade")
-    refute((HOMEBREW_CELLAR/"testball/0.1").directory?,
-      "The latest version directory should NOT be created")
-
-    cmd("unpin", "testball")
-    cmd("upgrade")
-    assert((HOMEBREW_CELLAR/"testball/0.1").directory?,
-      "The latest version directory should be created")
-  end
-
-  def test_reinstall
-    setup_test_formula "testball"
-
-    cmd("install", "testball", "--with-foo")
-    foo_dir = HOMEBREW_CELLAR/"testball/0.1/foo"
-    assert foo_dir.exist?
-    foo_dir.rmtree
-    assert_match "Reinstalling testball with --with-foo",
-      cmd("reinstall", "testball")
-    assert foo_dir.exist?
-  end
-
-  def test_reinstall_pinned
-    setup_test_formula "testball"
-
-    HOMEBREW_CELLAR.join("testball/0.1").mkpath
-    HOMEBREW_PINNED_KEGS.mkpath
-    FileUtils.ln_s HOMEBREW_CELLAR.join("testball/0.1"), HOMEBREW_PINNED_KEGS/"testball"
-
-    assert_match "testball is pinned. You must unpin it to reinstall.", cmd("reinstall", "testball")
-
-    HOMEBREW_PINNED_KEGS.rmtree
-  end
-
-  def test_home
-    setup_test_formula "testball"
-
-    assert_equal HOMEBREW_WWW,
-                 cmd("home", "HOMEBREW_BROWSER" => "echo")
-    assert_equal Formula["testball"].homepage,
-                 cmd("home", "testball", "HOMEBREW_BROWSER" => "echo")
-  end
-
-  def test_list
-    formulae = %w[bar foo qux]
-    formulae.each do |f|
-      (HOMEBREW_CELLAR/"#{f}/1.0/somedir").mkpath
-    end
-
-    assert_equal formulae.join("\n"),
-                 cmd("list")
-  end
-
-  def test_create
-    url = "file://#{File.expand_path("..", __FILE__)}/tarballs/testball-0.1.tbz"
-    cmd("create", url, "HOMEBREW_EDITOR" => "/bin/cat")
-
-    formula_file = CoreTap.new.formula_dir/"testball.rb"
-    assert formula_file.exist?, "The formula source should have been created"
-    assert_match %(sha256 "#{TESTBALL_SHA256}"), formula_file.read
-  end
-
-  def test_fetch
-    setup_test_formula "testball"
-
-    cmd("fetch", "testball")
-    assert((HOMEBREW_CACHE/"testball-0.1.tbz").exist?,
-      "The tarball should have been cached")
-  end
-
-  def test_deps
-    setup_test_formula "foo"
-    setup_test_formula "bar"
-    setup_test_formula "baz", <<-EOS.undent
-      url "https://example.com/baz-1.0"
-      depends_on "bar"
-    EOS
-
-    assert_equal "", cmd("deps", "foo")
-    assert_equal "foo", cmd("deps", "bar")
-    assert_equal "bar\nfoo", cmd("deps", "baz")
-  end
-
-  def test_uses
-    setup_test_formula "foo"
-    setup_test_formula "bar"
-    setup_test_formula "baz", <<-EOS.undent
-      url "https://example.com/baz-1.0"
-      depends_on "bar"
-    EOS
-
-    assert_equal "", cmd("uses", "baz")
-    assert_equal "baz", cmd("uses", "bar")
-    assert_equal "bar\nbaz", cmd("uses", "--recursive", "foo")
-  end
-
-  def test_log
-    FileUtils.cd HOMEBREW_REPOSITORY do
-      shutup do
-        system "git", "init"
-        system "git", "commit", "--allow-empty", "-m", "This is a test commit"
-      end
-    end
-    assert_match "This is a test commit", cmd("log")
-  end
-
-  def test_log_formula
-    core_tap = CoreTap.new
-    setup_test_formula "testball"
-
-    core_tap.path.cd do
-      shutup do
-        system "git", "init"
-        system "git", "add", "--all"
-        system "git", "commit", "-m", "This is a test commit for Testball"
-      end
-    end
-
-    core_tap_url = "file://#{core_tap.path}"
-    shallow_tap = Tap.fetch("homebrew", "shallow")
-    shutup do
-      system "git", "clone", "--depth=1", core_tap_url, shallow_tap.path
-    end
-
-    assert_match "This is a test commit for Testball",
-                 cmd("log", "#{shallow_tap}/testball")
-    assert_predicate shallow_tap.path/".git/shallow", :exist?,
-                     "A shallow clone should have been created."
-  end
-
-  def test_leaves
-    setup_test_formula "foo"
-    setup_test_formula "bar"
-    assert_equal "", cmd("leaves")
-
-    (HOMEBREW_CELLAR/"foo/0.1/somedir").mkpath
-    assert_equal "foo", cmd("leaves")
-
-    (HOMEBREW_CELLAR/"bar/0.1/somedir").mkpath
-    assert_equal "bar", cmd("leaves")
-  end
-
-  def test_prune
-    share = (HOMEBREW_PREFIX/"share")
-
-    (share/"pruneable/directory/here").mkpath
-    (share/"notpruneable/file").write "I'm here"
-    FileUtils.ln_s "/i/dont/exist/no/really/i/dont", share/"pruneable_symlink"
-
-    assert_match %r{Would remove \(empty directory\): .*/pruneable/directory/here},
-      cmd("prune", "--dry-run")
-    assert_match "Pruned 1 symbolic links and 3 directories",
-      cmd("prune")
-    refute((share/"pruneable").directory?)
-    assert((share/"notpruneable").directory?)
-    refute((share/"pruneable_symlink").symlink?)
-
-    assert_match "Nothing pruned", cmd("prune", "--verbose")
-  end
-
-  def test_custom_command
-    mktmpdir do |path|
-      cmd = "int-test-#{rand}"
-      file = "#{path}/brew-#{cmd}"
-
-      File.open(file, "w") { |f| f.write "#!/bin/sh\necho 'I am #{cmd}'\n" }
-      FileUtils.chmod 0777, file
-
-      assert_match "I am #{cmd}",
-        cmd(cmd, "PATH" => "#{path}#{File::PATH_SEPARATOR}#{ENV["PATH"]}")
-    end
-  end
-
-  def test_search
-    setup_test_formula "testball"
-    desc_cache = HOMEBREW_CACHE/"desc_cache.json"
-    refute_predicate desc_cache, :exist?, "Cached file should not exist"
-
-    assert_match "testball", cmd("search")
-    assert_match "testball", cmd("search", "testball")
-    assert_match "testball", cmd("search", "homebrew/homebrew-core/testball")
-    assert_match "testball", cmd("search", "--desc", "Some test")
-
-    flags = {
-      "macports" => "https://www.macports.org/ports.php?by=name&substr=testball",
-      "fink" => "http://pdb.finkproject.org/pdb/browse.php?summary=testball",
-      "debian" => "https://packages.debian.org/search?keywords=testball&searchon=names&suite=all&section=all",
-      "opensuse" => "https://software.opensuse.org/search?q=testball",
-      "fedora" => "https://admin.fedoraproject.org/pkgdb/packages/%2Atestball%2A/",
-      "ubuntu" => "http://packages.ubuntu.com/search?keywords=testball&searchon=names&suite=all&section=all",
-    }
-
-    flags.each do |flag, url|
-      assert_equal url, cmd("search", "--#{flag}",
-        "testball", "HOMEBREW_BROWSER" => "echo")
-    end
-
-    assert_predicate desc_cache, :exist?, "Cached file should exist"
-  end
-
-  def test_bundle
-    needs_test_cmd_taps
-    setup_remote_tap("homebrew/bundle")
-    HOMEBREW_REPOSITORY.cd do
-      shutup do
-        system "git", "init"
-        system "git", "commit", "--allow-empty", "-m", "This is a test commit"
-      end
-    end
-
-    mktmpdir do |path|
-      FileUtils.touch "#{path}/Brewfile"
-      Dir.chdir path do
-        assert_equal "The Brewfile's dependencies are satisfied.",
-          cmd("bundle", "check")
-      end
-    end
-  end
-
-  def test_cask
-    needs_test_cmd_taps
-    needs_macos
-    setup_remote_tap("caskroom/cask")
-    cmd("cask", "list")
-  end
-
-  def test_services
-    needs_test_cmd_taps
-    needs_macos
-    setup_remote_tap("homebrew/services")
-    assert_equal "Warning: No services available to control with `brew services`",
-      cmd("services", "list")
-  end
-
-  def test_link
-    assert_match "This command requires a keg argument", cmd_fail("link")
-
-    setup_test_formula "testball1"
-    cmd("install", "testball1")
-    cmd("link", "testball1")
-
-    cmd("unlink", "testball1")
-    assert_match "Would link", cmd("link", "--dry-run", "testball1")
-    assert_match "Would remove",
-      cmd("link", "--dry-run", "--overwrite", "testball1")
-    assert_match "Linking", cmd("link", "testball1")
-
-    setup_test_formula "testball2", <<-EOS.undent
-      keg_only "just because"
-    EOS
-    cmd("install", "testball2")
-    assert_match "testball2 is keg-only", cmd("link", "testball2")
-  end
-
-  def test_unlink
-    setup_test_formula "testball"
-
-    cmd("install", "testball")
-    assert_match "Would remove", cmd("unlink", "--dry-run", "testball")
-  end
-
-  def test_irb
-    assert_match "'v8'.f # => instance of the v8 formula",
-      cmd("irb", "--examples")
-
-    setup_test_formula "testball"
-
-    irb_test = HOMEBREW_TEMP/"irb-test.rb"
-    irb_test.write <<-EOS.undent
-      "testball".f
-      :testball.f
-      exit
-    EOS
-
-    assert_match "Interactive Homebrew Shell", cmd("irb", irb_test)
-  end
-
-  def test_pull_offline
-    assert_match "You meant `git pull --rebase`.", cmd_fail("pull", "--rebase")
-    assert_match "This command requires at least one argument", cmd_fail("pull")
-    assert_match "Not a GitHub pull request or commit",
-      cmd_fail("pull", "0")
-  end
-
-  def test_pull
-    skip "Requires network connection" if ENV["HOMEBREW_NO_GITHUB_API"]
-
-    core_tap = CoreTap.new
-    core_tap.path.cd do
-      shutup do
-        system "git", "init"
-        system "git", "checkout", "-b", "new-branch"
-      end
-    end
-
-    assert_match "Testing URLs require `--bottle`!",
-      cmd_fail("pull", "https://bot.brew.sh/job/Homebrew\%20Testing/1028/")
-    assert_match "Current branch is new-branch",
-      cmd_fail("pull", "1")
-    assert_match "No changed formulae found to bump",
-      cmd_fail("pull", "--bump", "8")
-    assert_match "Can only bump one changed formula",
-      cmd_fail("pull", "--bump",
-        "https://api.github.com/repos/Homebrew/homebrew-core/pulls/122")
-    assert_match "Patch failed to apply",
-      cmd_fail("pull", "https://github.com/Homebrew/homebrew-core/pull/1")
-  end
-
-  def test_analytics
-    HOMEBREW_REPOSITORY.cd do
-      shutup do
-        system "git", "init"
-      end
-    end
-
-    assert_match "Analytics is disabled (by HOMEBREW_NO_ANALYTICS)",
-      cmd("analytics", "HOMEBREW_NO_ANALYTICS" => "1")
-
-    cmd("analytics", "off")
-    assert_match "Analytics is disabled",
-      cmd("analytics", "HOMEBREW_NO_ANALYTICS" => nil)
-
-    cmd("analytics", "on")
-    assert_match "Analytics is enabled", cmd("analytics",
-      "HOMEBREW_NO_ANALYTICS" => nil)
-
-    assert_match "Invalid usage", cmd_fail("analytics", "on", "off")
-    assert_match "Invalid usage", cmd_fail("analytics", "testball")
-    cmd("analytics", "regenerate-uuid")
-  end
-
-  def test_migrate
-    setup_test_formula "testball1"
-    setup_test_formula "testball2"
-    assert_match "Invalid usage", cmd_fail("migrate")
-    assert_match "No available formula with the name \"testball\"",
-      cmd_fail("migrate", "testball")
-    assert_match "testball1 doesn't replace any formula",
-      cmd_fail("migrate", "testball1")
-
-    install_and_rename_coretap_formula "testball1", "testball2"
-    assert_match "Migrating testball1 to testball2", cmd("migrate", "testball1")
-    (HOMEBREW_CELLAR/"testball1").unlink
-    assert_match "Error: No such keg", cmd_fail("migrate", "testball1")
-  end
-
-  def test_switch
-    assert_match "Usage: brew switch <name> <version>", cmd_fail("switch")
-    assert_match "testball not found", cmd_fail("switch", "testball", "0.1")
-
-    setup_test_formula "testball", <<-EOS.undent
-      keg_only "just because"
-    EOS
-
-    cmd("install", "testball")
-    testball_rack = HOMEBREW_CELLAR/"testball"
-    FileUtils.cp_r testball_rack/"0.1", testball_rack/"0.2"
-
-    cmd("switch", "testball", "0.2")
-    assert_match "testball does not have a version \"0.3\"",
-      cmd_fail("switch", "testball", "0.3")
-  end
-
-  def test_test_formula
-    assert_match "This command requires a formula argument", cmd_fail("test")
-    assert_match "Testing requires the latest version of testball",
-      cmd_fail("test", testball)
-
-    cmd("install", testball)
-    assert_match "testball defines no test", cmd_fail("test", testball)
-
-    setup_test_formula "testball_copy", <<-EOS.undent
-      head "https://github.com/example/testball2.git"
-
-      devel do
-        url "file://#{File.expand_path("..", __FILE__)}/tarballs/testball-0.1.tbz"
-        sha256 "#{TESTBALL_SHA256}"
-      end
-
-      keg_only "just because"
-
-      test do
-      end
-    EOS
-
-    cmd("install", "testball_copy")
-    assert_match "Testing testball_copy", cmd("test", "--HEAD", "testball_copy")
-    assert_match "Testing testball_copy", cmd("test", "--devel", "testball_copy")
-  end
-end
diff --git a/Library/Homebrew/test/test_integration_cmds_analytics.rb b/Library/Homebrew/test/test_integration_cmds_analytics.rb
new file mode 100644
index 0000000000000000000000000000000000000000..17afe7fe85412c2166a4bb4149349dbb9ae9c256
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_analytics.rb
@@ -0,0 +1,26 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestAnalytics < IntegrationCommandTests
+  def test_analytics
+    HOMEBREW_REPOSITORY.cd do
+      shutup do
+        system "git", "init"
+      end
+    end
+
+    assert_match "Analytics is disabled (by HOMEBREW_NO_ANALYTICS)",
+      cmd("analytics", "HOMEBREW_NO_ANALYTICS" => "1")
+
+    cmd("analytics", "off")
+    assert_match "Analytics is disabled",
+      cmd("analytics", "HOMEBREW_NO_ANALYTICS" => nil)
+
+    cmd("analytics", "on")
+    assert_match "Analytics is enabled", cmd("analytics",
+      "HOMEBREW_NO_ANALYTICS" => nil)
+
+    assert_match "Invalid usage", cmd_fail("analytics", "on", "off")
+    assert_match "Invalid usage", cmd_fail("analytics", "testball")
+    cmd("analytics", "regenerate-uuid")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_bottle.rb b/Library/Homebrew/test/test_integration_cmds_bottle.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b6d9de714cd7a109dada0ba9d5de35bd824d2d78
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_bottle.rb
@@ -0,0 +1,21 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestBottle < IntegrationCommandTests
+  def test_bottle
+    cmd("install", "--build-bottle", testball)
+    assert_match "Formula not from core or any taps",
+                 cmd_fail("bottle", "--no-rebuild", testball)
+
+    setup_test_formula "testball"
+
+    # `brew bottle` should not fail with dead symlink
+    # https://github.com/Homebrew/legacy-homebrew/issues/49007
+    (HOMEBREW_CELLAR/"testball/0.1").cd do
+      FileUtils.ln_s "not-exist", "symlink"
+    end
+    assert_match(/testball-0\.1.*\.bottle\.tar\.gz/,
+                  cmd_output("bottle", "--no-rebuild", "testball"))
+  ensure
+    FileUtils.rm_f Dir["testball-0.1*.bottle.tar.gz"]
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_bundle.rb b/Library/Homebrew/test/test_integration_cmds_bundle.rb
new file mode 100644
index 0000000000000000000000000000000000000000..726bd4d106a52f3cd40d1370f952f56756b5170f
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_bundle.rb
@@ -0,0 +1,22 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestBundle < IntegrationCommandTests
+  def test_bundle
+    needs_test_cmd_taps
+    setup_remote_tap("homebrew/bundle")
+    HOMEBREW_REPOSITORY.cd do
+      shutup do
+        system "git", "init"
+        system "git", "commit", "--allow-empty", "-m", "This is a test commit"
+      end
+    end
+
+    mktmpdir do |path|
+      FileUtils.touch "#{path}/Brewfile"
+      Dir.chdir path do
+        assert_equal "The Brewfile's dependencies are satisfied.",
+          cmd("bundle", "check")
+      end
+    end
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_cache.rb b/Library/Homebrew/test/test_integration_cmds_cache.rb
new file mode 100644
index 0000000000000000000000000000000000000000..716724f4f968293a58efe16854e8beed7154e5b3
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_cache.rb
@@ -0,0 +1,8 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestCache < IntegrationCommandTests
+  def test_cache
+    assert_equal HOMEBREW_CACHE.to_s,
+                 cmd("--cache")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_cache_formula.rb b/Library/Homebrew/test/test_integration_cmds_cache_formula.rb
new file mode 100644
index 0000000000000000000000000000000000000000..82c3421b2429f778abe770c823826f9fef5e4a61
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_cache_formula.rb
@@ -0,0 +1,8 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestCacheFormula < IntegrationCommandTests
+  def test_cache_formula
+    assert_match %r{#{HOMEBREW_CACHE}/testball-},
+                 cmd("--cache", testball)
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_cask.rb b/Library/Homebrew/test/test_integration_cmds_cask.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e97bb868c5b14ed963f0f65c29a0f6659ddc1a62
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_cask.rb
@@ -0,0 +1,10 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestCask < IntegrationCommandTests
+  def test_cask
+    needs_test_cmd_taps
+    needs_macos
+    setup_remote_tap("caskroom/cask")
+    cmd("cask", "list")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_cat.rb b/Library/Homebrew/test/test_integration_cmds_cat.rb
new file mode 100644
index 0000000000000000000000000000000000000000..ad4ef199b6a258f692b321c39749335c7df76927
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_cat.rb
@@ -0,0 +1,8 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestCat < IntegrationCommandTests
+  def test_cat
+    formula_file = setup_test_formula "testball"
+    assert_equal formula_file.read.chomp, cmd("cat", "testball")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_cellar.rb b/Library/Homebrew/test/test_integration_cmds_cellar.rb
new file mode 100644
index 0000000000000000000000000000000000000000..3adb8fccad77a67bd91dfdc960ab738ec8a760f3
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_cellar.rb
@@ -0,0 +1,8 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestCellar < IntegrationCommandTests
+  def test_cellar
+    assert_equal HOMEBREW_CELLAR.to_s,
+                 cmd("--cellar")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_cellar_formula.rb b/Library/Homebrew/test/test_integration_cmds_cellar_formula.rb
new file mode 100644
index 0000000000000000000000000000000000000000..356c79d6d4d7565c1137a2585dc6555e1645c18d
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_cellar_formula.rb
@@ -0,0 +1,8 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestCellarFormula < IntegrationCommandTests
+  def test_cellar_formula
+    assert_match "#{HOMEBREW_CELLAR}/testball",
+                 cmd("--cellar", testball)
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_cleanup.rb b/Library/Homebrew/test/test_integration_cmds_cleanup.rb
new file mode 100644
index 0000000000000000000000000000000000000000..fe9ce9952ce1bf0854b695f29a69e46e5a0b84ff
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_cleanup.rb
@@ -0,0 +1,8 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestCleanup < IntegrationCommandTests
+  def test_cleanup
+    (HOMEBREW_CACHE/"test").write "test"
+    assert_match "#{HOMEBREW_CACHE}/test", cmd("cleanup", "--prune=all")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_command.rb b/Library/Homebrew/test/test_integration_cmds_command.rb
new file mode 100644
index 0000000000000000000000000000000000000000..33cfdc8ed5cc2ea1e7cfeb59daa6af97cd7959d6
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_command.rb
@@ -0,0 +1,11 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestCommand < IntegrationCommandTests
+  def test_command
+    assert_equal "#{HOMEBREW_LIBRARY_PATH}/cmd/info.rb",
+                 cmd("command", "info")
+
+    assert_match "Unknown command",
+                 cmd_fail("command", "I-don't-exist")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_commands.rb b/Library/Homebrew/test/test_integration_cmds_commands.rb
new file mode 100644
index 0000000000000000000000000000000000000000..47c4e25ca68b4f634d7cd81e6e237f5f340221ef
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_commands.rb
@@ -0,0 +1,8 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestCommands < IntegrationCommandTests
+  def test_commands
+    assert_match "Built-in commands",
+                 cmd("commands")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_config.rb b/Library/Homebrew/test/test_integration_cmds_config.rb
new file mode 100644
index 0000000000000000000000000000000000000000..f1cb5cb7e9b3ecbe25246bb206411da34cbfe1d3
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_config.rb
@@ -0,0 +1,8 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestConfig < IntegrationCommandTests
+  def test_config
+    assert_match "HOMEBREW_VERSION: #{HOMEBREW_VERSION}",
+                 cmd("config")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_create.rb b/Library/Homebrew/test/test_integration_cmds_create.rb
new file mode 100644
index 0000000000000000000000000000000000000000..20765f9c82b08a455e37e40646e568b244dbad49
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_create.rb
@@ -0,0 +1,12 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestCreate < IntegrationCommandTests
+  def test_create
+    url = "file://#{File.expand_path("..", __FILE__)}/tarballs/testball-0.1.tbz"
+    cmd("create", url, "HOMEBREW_EDITOR" => "/bin/cat")
+
+    formula_file = CoreTap.new.formula_dir/"testball.rb"
+    assert formula_file.exist?, "The formula source should have been created"
+    assert_match %(sha256 "#{TESTBALL_SHA256}"), formula_file.read
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_custom_command.rb b/Library/Homebrew/test/test_integration_cmds_custom_command.rb
new file mode 100644
index 0000000000000000000000000000000000000000..3ea2e6360dc59b1cfb4a4cd516c8c5e53fc64227
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_custom_command.rb
@@ -0,0 +1,16 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestCustomCommand < IntegrationCommandTests
+  def test_custom_command
+    mktmpdir do |path|
+      cmd = "int-test-#{rand}"
+      file = "#{path}/brew-#{cmd}"
+
+      File.open(file, "w") { |f| f.write "#!/bin/sh\necho 'I am #{cmd}'\n" }
+      FileUtils.chmod 0777, file
+
+      assert_match "I am #{cmd}",
+        cmd(cmd, "PATH" => "#{path}#{File::PATH_SEPARATOR}#{ENV["PATH"]}")
+    end
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_deps.rb b/Library/Homebrew/test/test_integration_cmds_deps.rb
new file mode 100644
index 0000000000000000000000000000000000000000..10a654b60ca421117e0cb2c6f4f045ff366057b9
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_deps.rb
@@ -0,0 +1,16 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestDeps < IntegrationCommandTests
+  def test_deps
+    setup_test_formula "foo"
+    setup_test_formula "bar"
+    setup_test_formula "baz", <<-EOS.undent
+      url "https://example.com/baz-1.0"
+      depends_on "bar"
+    EOS
+
+    assert_equal "", cmd("deps", "foo")
+    assert_equal "foo", cmd("deps", "bar")
+    assert_equal "bar\nfoo", cmd("deps", "baz")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_desc.rb b/Library/Homebrew/test/test_integration_cmds_desc.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e93b715782441b7e8784794b9795d8bea68df0af
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_desc.rb
@@ -0,0 +1,17 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestDesc < IntegrationCommandTests
+  def test_desc
+    setup_test_formula "testball"
+
+    assert_equal "testball: Some test", cmd("desc", "testball")
+    assert_match "Pick one, and only one", cmd_fail("desc", "--search", "--name")
+    assert_match "You must provide a search term", cmd_fail("desc", "--search")
+
+    desc_cache = HOMEBREW_CACHE/"desc_cache.json"
+    refute_predicate desc_cache, :exist?, "Cached file should not exist"
+
+    cmd("desc", "--description", "testball")
+    assert_predicate desc_cache, :exist?, "Cached file should not exist"
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_doctor.rb b/Library/Homebrew/test/test_integration_cmds_doctor.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e3edf1b0f561dd68f1db92639e3c8320bcd991fb
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_doctor.rb
@@ -0,0 +1,8 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestDoctor < IntegrationCommandTests
+  def test_doctor
+    assert_match "This is an integration test",
+                 cmd_fail("doctor", "check_integration_test")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_edit.rb b/Library/Homebrew/test/test_integration_cmds_edit.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b47e0d4f9ae507335e39540a7b77d0e2c4c22b23
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_edit.rb
@@ -0,0 +1,11 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestEdit < IntegrationCommandTests
+  def test_edit
+    (HOMEBREW_REPOSITORY/".git").mkpath
+    setup_test_formula "testball"
+
+    assert_match "# something here",
+                 cmd("edit", "testball", "HOMEBREW_EDITOR" => "/bin/cat")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_env.rb b/Library/Homebrew/test/test_integration_cmds_env.rb
new file mode 100644
index 0000000000000000000000000000000000000000..9f6fc7cbb42fe54ae1679457d724977aca87e6a6
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_env.rb
@@ -0,0 +1,8 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestEnv < IntegrationCommandTests
+  def test_env
+    assert_match(/CMAKE_PREFIX_PATH="#{Regexp.escape(HOMEBREW_PREFIX)}[:"]/,
+                 cmd("--env"))
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_env_bash.rb b/Library/Homebrew/test/test_integration_cmds_env_bash.rb
new file mode 100644
index 0000000000000000000000000000000000000000..71f807199f03cd7812513ad4910650723775deb5
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_env_bash.rb
@@ -0,0 +1,8 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestEnvBash < IntegrationCommandTests
+  def test_env_bash
+    assert_match(/export CMAKE_PREFIX_PATH="#{Regexp.quote(HOMEBREW_PREFIX.to_s)}"/,
+                 cmd("--env", "--shell=bash"))
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_env_csh.rb b/Library/Homebrew/test/test_integration_cmds_env_csh.rb
new file mode 100644
index 0000000000000000000000000000000000000000..19a6ed7d2f95314f051f1cb33f66e65fea0dbccd
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_env_csh.rb
@@ -0,0 +1,8 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestEnvCsh < IntegrationCommandTests
+  def test_env_csh
+    assert_match(/setenv CMAKE_PREFIX_PATH #{Regexp.quote(HOMEBREW_PREFIX.to_s)};/,
+                 cmd("--env", "--shell=tcsh"))
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_env_fish.rb b/Library/Homebrew/test/test_integration_cmds_env_fish.rb
new file mode 100644
index 0000000000000000000000000000000000000000..9c4bf0e16d225bbf0de586e48216f7fc2cede27b
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_env_fish.rb
@@ -0,0 +1,8 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestEnvFish < IntegrationCommandTests
+  def test_env_fish
+    assert_match(/set [-]gx CMAKE_PREFIX_PATH "#{Regexp.quote(HOMEBREW_PREFIX.to_s)}"/,
+                 cmd("--env", "--shell=fish"))
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_env_plain.rb b/Library/Homebrew/test/test_integration_cmds_env_plain.rb
new file mode 100644
index 0000000000000000000000000000000000000000..a21ad7f033cf08860d794ed4f0e6ca408390b2fb
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_env_plain.rb
@@ -0,0 +1,8 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestEnvPlain < IntegrationCommandTests
+  def test_env_plain
+    assert_match(/CMAKE_PREFIX_PATH: #{Regexp.quote(HOMEBREW_PREFIX)}/,
+                 cmd("--env", "--plain"))
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_fetch.rb b/Library/Homebrew/test/test_integration_cmds_fetch.rb
new file mode 100644
index 0000000000000000000000000000000000000000..9c060a3538a70f275f003ade2641da431eb60f1f
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_fetch.rb
@@ -0,0 +1,11 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestFetch < IntegrationCommandTests
+  def test_fetch
+    setup_test_formula "testball"
+
+    cmd("fetch", "testball")
+    assert((HOMEBREW_CACHE/"testball-0.1.tbz").exist?,
+      "The tarball should have been cached")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_help.rb b/Library/Homebrew/test/test_integration_cmds_help.rb
new file mode 100644
index 0000000000000000000000000000000000000000..44fd774c9732d2a3d4148036c533e4bff82d66e4
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_help.rb
@@ -0,0 +1,21 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestHelp < IntegrationCommandTests
+  def test_help
+    assert_match "Example usage:\n",
+                 cmd_fail # Generic help (empty argument list).
+    assert_match "Unknown command: command-that-does-not-exist",
+                 cmd_fail("help", "command-that-does-not-exist")
+    assert_match(/^brew cat /,
+                 cmd_fail("cat")) # Missing formula argument triggers help.
+
+    assert_match "Example usage:\n",
+                 cmd("help") # Generic help.
+    assert_match(/^brew cat /,
+                 cmd("help", "cat")) # Internal command (documented, Ruby).
+    assert_match(/^brew update /,
+                 cmd("help", "update")) # Internal command (documented, Shell).
+    assert_match(/^brew update-test /,
+                 cmd("help", "update-test")) # Internal developer command (documented, Ruby).
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_home.rb b/Library/Homebrew/test/test_integration_cmds_home.rb
new file mode 100644
index 0000000000000000000000000000000000000000..ef21e85ca1353e2f4546a2cc2a2955c16f7c6257
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_home.rb
@@ -0,0 +1,12 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestHome < IntegrationCommandTests
+  def test_home
+    setup_test_formula "testball"
+
+    assert_equal HOMEBREW_WWW,
+                 cmd("home", "HOMEBREW_BROWSER" => "echo")
+    assert_equal Formula["testball"].homepage,
+                 cmd("home", "testball", "HOMEBREW_BROWSER" => "echo")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_info.rb b/Library/Homebrew/test/test_integration_cmds_info.rb
new file mode 100644
index 0000000000000000000000000000000000000000..acb272d15b37af5a4cd8a3638bc7db31e0a67be8
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_info.rb
@@ -0,0 +1,10 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestInfo < IntegrationCommandTests
+  def test_info
+    setup_test_formula "testball"
+
+    assert_match "testball: stable 0.1",
+                 cmd("info", "testball")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_install.rb b/Library/Homebrew/test/test_integration_cmds_install.rb
new file mode 100644
index 0000000000000000000000000000000000000000..7ce4a3484d5104f3bd9d60b5e7edbf5f83621373
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_install.rb
@@ -0,0 +1,24 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestInstall < IntegrationCommandTests
+  def test_install
+    setup_test_formula "testball1"
+    assert_match "Specify `--HEAD`", cmd_fail("install", "testball1", "--head")
+    assert_match "No head is defined", cmd_fail("install", "testball1", "--HEAD")
+    assert_match "No devel block", cmd_fail("install", "testball1", "--devel")
+    assert_match "#{HOMEBREW_CELLAR}/testball1/0.1", cmd("install", "testball1")
+    assert_match "testball1-0.1 already installed", cmd("install", "testball1")
+    assert_match "MacRuby is not packaged", cmd_fail("install", "macruby")
+    assert_match "No available formula", cmd_fail("install", "formula")
+    assert_match "This similarly named formula was found",
+      cmd_fail("install", "testball")
+
+    setup_test_formula "testball2"
+    assert_match "These similarly named formulae were found",
+      cmd_fail("install", "testball")
+
+    install_and_rename_coretap_formula "testball1", "testball2"
+    assert_match "testball1 already installed, it's just not migrated",
+      cmd("install", "testball2")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_irb.rb b/Library/Homebrew/test/test_integration_cmds_irb.rb
new file mode 100644
index 0000000000000000000000000000000000000000..338b32fd97928f08cf5ca5d62013f74f148016b3
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_irb.rb
@@ -0,0 +1,19 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestIrb < IntegrationCommandTests
+  def test_irb
+    assert_match "'v8'.f # => instance of the v8 formula",
+      cmd("irb", "--examples")
+
+    setup_test_formula "testball"
+
+    irb_test = HOMEBREW_TEMP/"irb-test.rb"
+    irb_test.write <<-EOS.undent
+      "testball".f
+      :testball.f
+      exit
+    EOS
+
+    assert_match "Interactive Homebrew Shell", cmd("irb", irb_test)
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_leaves.rb b/Library/Homebrew/test/test_integration_cmds_leaves.rb
new file mode 100644
index 0000000000000000000000000000000000000000..2ea7779d69da7127d89bc7cf088ae3167e7ccc00
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_leaves.rb
@@ -0,0 +1,15 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestLeaves < IntegrationCommandTests
+  def test_leaves
+    setup_test_formula "foo"
+    setup_test_formula "bar"
+    assert_equal "", cmd("leaves")
+
+    (HOMEBREW_CELLAR/"foo/0.1/somedir").mkpath
+    assert_equal "foo", cmd("leaves")
+
+    (HOMEBREW_CELLAR/"bar/0.1/somedir").mkpath
+    assert_equal "bar", cmd("leaves")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_link.rb b/Library/Homebrew/test/test_integration_cmds_link.rb
new file mode 100644
index 0000000000000000000000000000000000000000..8c4255476f6e31530035e85bf751eaa4c8c51606
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_link.rb
@@ -0,0 +1,23 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestLink < IntegrationCommandTests
+  def test_link
+    assert_match "This command requires a keg argument", cmd_fail("link")
+
+    setup_test_formula "testball1"
+    cmd("install", "testball1")
+    cmd("link", "testball1")
+
+    cmd("unlink", "testball1")
+    assert_match "Would link", cmd("link", "--dry-run", "testball1")
+    assert_match "Would remove",
+      cmd("link", "--dry-run", "--overwrite", "testball1")
+    assert_match "Linking", cmd("link", "testball1")
+
+    setup_test_formula "testball2", <<-EOS.undent
+      keg_only "just because"
+    EOS
+    cmd("install", "testball2")
+    assert_match "testball2 is keg-only", cmd("link", "testball2")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_linkapps.rb b/Library/Homebrew/test/test_integration_cmds_linkapps.rb
new file mode 100644
index 0000000000000000000000000000000000000000..9afb84b77bc29713bb018c3ca6f09ee04a50e357
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_linkapps.rb
@@ -0,0 +1,15 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestLinkapps < IntegrationCommandTests
+  def test_linkapps
+    home_dir = Pathname.new(mktmpdir)
+    (home_dir/"Applications").mkpath
+
+    setup_test_formula "testball"
+
+    source_dir = HOMEBREW_CELLAR/"testball/0.1/TestBall.app"
+    source_dir.mkpath
+    assert_match "Linking: #{source_dir}",
+      cmd("linkapps", "--local", "HOME" => home_dir)
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_list.rb b/Library/Homebrew/test/test_integration_cmds_list.rb
new file mode 100644
index 0000000000000000000000000000000000000000..917366905f57dceca66b4da24ba2da7e85745e3b
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_list.rb
@@ -0,0 +1,13 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestList < IntegrationCommandTests
+  def test_list
+    formulae = %w[bar foo qux]
+    formulae.each do |f|
+      (HOMEBREW_CELLAR/"#{f}/1.0/somedir").mkpath
+    end
+
+    assert_equal formulae.join("\n"),
+                 cmd("list")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_log.rb b/Library/Homebrew/test/test_integration_cmds_log.rb
new file mode 100644
index 0000000000000000000000000000000000000000..1799d777db52af418352777c9d61ff3c0fc7d895
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_log.rb
@@ -0,0 +1,13 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestLog < IntegrationCommandTests
+  def test_log
+    FileUtils.cd HOMEBREW_REPOSITORY do
+      shutup do
+        system "git", "init"
+        system "git", "commit", "--allow-empty", "-m", "This is a test commit"
+      end
+    end
+    assert_match "This is a test commit", cmd("log")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_log_formula.rb b/Library/Homebrew/test/test_integration_cmds_log_formula.rb
new file mode 100644
index 0000000000000000000000000000000000000000..2f1f44d0056cbd75f4a4fc12582d25e4c2ea1182
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_log_formula.rb
@@ -0,0 +1,27 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestLogFormula < IntegrationCommandTests
+  def test_log_formula
+    core_tap = CoreTap.new
+    setup_test_formula "testball"
+
+    core_tap.path.cd do
+      shutup do
+        system "git", "init"
+        system "git", "add", "--all"
+        system "git", "commit", "-m", "This is a test commit for Testball"
+      end
+    end
+
+    core_tap_url = "file://#{core_tap.path}"
+    shallow_tap = Tap.fetch("homebrew", "shallow")
+    shutup do
+      system "git", "clone", "--depth=1", core_tap_url, shallow_tap.path
+    end
+
+    assert_match "This is a test commit for Testball",
+                 cmd("log", "#{shallow_tap}/testball")
+    assert_predicate shallow_tap.path/".git/shallow", :exist?,
+                     "A shallow clone should have been created."
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_migrate.rb b/Library/Homebrew/test/test_integration_cmds_migrate.rb
new file mode 100644
index 0000000000000000000000000000000000000000..3918cbb3e68cbc6259122267c1b01a919a5c0aa6
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_migrate.rb
@@ -0,0 +1,18 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestMigrate < IntegrationCommandTests
+  def test_migrate
+    setup_test_formula "testball1"
+    setup_test_formula "testball2"
+    assert_match "Invalid usage", cmd_fail("migrate")
+    assert_match "No available formula with the name \"testball\"",
+      cmd_fail("migrate", "testball")
+    assert_match "testball1 doesn't replace any formula",
+      cmd_fail("migrate", "testball1")
+
+    install_and_rename_coretap_formula "testball1", "testball2"
+    assert_match "Migrating testball1 to testball2", cmd("migrate", "testball1")
+    (HOMEBREW_CELLAR/"testball1").unlink
+    assert_match "Error: No such keg", cmd_fail("migrate", "testball1")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_missing.rb b/Library/Homebrew/test/test_integration_cmds_missing.rb
new file mode 100644
index 0000000000000000000000000000000000000000..68c3a72a45bc6ac786323d09b64f50fafaa476ef
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_missing.rb
@@ -0,0 +1,11 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestMissing < IntegrationCommandTests
+  def test_missing
+    setup_test_formula "foo"
+    setup_test_formula "bar"
+
+    (HOMEBREW_CELLAR/"bar/1.0").mkpath
+    assert_match "foo", cmd("missing")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_options.rb b/Library/Homebrew/test/test_integration_cmds_options.rb
new file mode 100644
index 0000000000000000000000000000000000000000..de527804c0cdf7f465ed41363b4bd2aed9508262
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_options.rb
@@ -0,0 +1,12 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestOptions < IntegrationCommandTests
+  def test_options
+    setup_test_formula "testball", <<-EOS.undent
+      depends_on "bar" => :recommended
+    EOS
+
+    assert_equal "--with-foo\n\tBuild with foo\n--without-bar\n\tBuild without bar support",
+      cmd_output("options", "testball").chomp
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_outdated.rb b/Library/Homebrew/test/test_integration_cmds_outdated.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b42e7bc1a23b7e4a3e347c5895f75aa15c7c7706
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_outdated.rb
@@ -0,0 +1,10 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestOutdated < IntegrationCommandTests
+  def test_outdated
+    setup_test_formula "testball"
+    (HOMEBREW_CELLAR/"testball/0.0.1/foo").mkpath
+
+    assert_equal "testball", cmd("outdated")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_pin_unpin.rb b/Library/Homebrew/test/test_integration_cmds_pin_unpin.rb
new file mode 100644
index 0000000000000000000000000000000000000000..828ca49c04e29382e7d80e2cf0bbb9980199a4fd
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_pin_unpin.rb
@@ -0,0 +1,18 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestPinUnpin < IntegrationCommandTests
+  def test_pin_unpin
+    setup_test_formula "testball"
+    (HOMEBREW_CELLAR/"testball/0.0.1/foo").mkpath
+
+    cmd("pin", "testball")
+    cmd("upgrade")
+    refute((HOMEBREW_CELLAR/"testball/0.1").directory?,
+      "The latest version directory should NOT be created")
+
+    cmd("unpin", "testball")
+    cmd("upgrade")
+    assert((HOMEBREW_CELLAR/"testball/0.1").directory?,
+      "The latest version directory should be created")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_prefix.rb b/Library/Homebrew/test/test_integration_cmds_prefix.rb
new file mode 100644
index 0000000000000000000000000000000000000000..80a71c5ec9625a7af9ce153791a9716a6be4d50b
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_prefix.rb
@@ -0,0 +1,8 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestPrefix < IntegrationCommandTests
+  def test_prefix
+    assert_equal HOMEBREW_PREFIX.to_s,
+                 cmd("--prefix")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_prefix_formula.rb b/Library/Homebrew/test/test_integration_cmds_prefix_formula.rb
new file mode 100644
index 0000000000000000000000000000000000000000..a901309cf7123edbb908cf5e23bb316b2aa5e40b
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_prefix_formula.rb
@@ -0,0 +1,8 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestPrefixFormula < IntegrationCommandTests
+  def test_prefix_formula
+    assert_match "#{HOMEBREW_CELLAR}/testball",
+                 cmd("--prefix", testball)
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_prune.rb b/Library/Homebrew/test/test_integration_cmds_prune.rb
new file mode 100644
index 0000000000000000000000000000000000000000..6072c832eb3f3ef34b1f07aab973194c7d8aa5c5
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_prune.rb
@@ -0,0 +1,21 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestPrune < IntegrationCommandTests
+  def test_prune
+    share = (HOMEBREW_PREFIX/"share")
+
+    (share/"pruneable/directory/here").mkpath
+    (share/"notpruneable/file").write "I'm here"
+    FileUtils.ln_s "/i/dont/exist/no/really/i/dont", share/"pruneable_symlink"
+
+    assert_match %r{Would remove \(empty directory\): .*/pruneable/directory/here},
+      cmd("prune", "--dry-run")
+    assert_match "Pruned 1 symbolic links and 3 directories",
+      cmd("prune")
+    refute((share/"pruneable").directory?)
+    assert((share/"notpruneable").directory?)
+    refute((share/"pruneable_symlink").symlink?)
+
+    assert_match "Nothing pruned", cmd("prune", "--verbose")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_pull.rb b/Library/Homebrew/test/test_integration_cmds_pull.rb
new file mode 100644
index 0000000000000000000000000000000000000000..1cfb286a3f2bf693565849565f03d6e4d753a8ba
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_pull.rb
@@ -0,0 +1,27 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestPull < IntegrationCommandTests
+  def test_pull
+    skip "Requires network connection" if ENV["HOMEBREW_NO_GITHUB_API"]
+
+    core_tap = CoreTap.new
+    core_tap.path.cd do
+      shutup do
+        system "git", "init"
+        system "git", "checkout", "-b", "new-branch"
+      end
+    end
+
+    assert_match "Testing URLs require `--bottle`!",
+      cmd_fail("pull", "https://bot.brew.sh/job/Homebrew\%20Testing/1028/")
+    assert_match "Current branch is new-branch",
+      cmd_fail("pull", "1")
+    assert_match "No changed formulae found to bump",
+      cmd_fail("pull", "--bump", "8")
+    assert_match "Can only bump one changed formula",
+      cmd_fail("pull", "--bump",
+        "https://api.github.com/repos/Homebrew/homebrew-core/pulls/122")
+    assert_match "Patch failed to apply",
+      cmd_fail("pull", "https://github.com/Homebrew/homebrew-core/pull/1")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_pull_offline.rb b/Library/Homebrew/test/test_integration_cmds_pull_offline.rb
new file mode 100644
index 0000000000000000000000000000000000000000..bb6fd24cffcd573cfe49ebd82f1c78c3608c1681
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_pull_offline.rb
@@ -0,0 +1,10 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestPullOffline < IntegrationCommandTests
+  def test_pull_offline
+    assert_match "You meant `git pull --rebase`.", cmd_fail("pull", "--rebase")
+    assert_match "This command requires at least one argument", cmd_fail("pull")
+    assert_match "Not a GitHub pull request or commit",
+      cmd_fail("pull", "0")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_readall.rb b/Library/Homebrew/test/test_integration_cmds_readall.rb
new file mode 100644
index 0000000000000000000000000000000000000000..1a6ca45471f4073ff22a846097d97705f8900c60
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_readall.rb
@@ -0,0 +1,12 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestReadall < IntegrationCommandTests
+  def test_readall
+    formula_file = setup_test_formula "testball"
+    alias_file = CoreTap.new.alias_dir/"foobar"
+    alias_file.parent.mkpath
+    FileUtils.ln_s formula_file, alias_file
+    cmd("readall", "--aliases", "--syntax")
+    cmd("readall", "homebrew/core")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_reinstall.rb b/Library/Homebrew/test/test_integration_cmds_reinstall.rb
new file mode 100644
index 0000000000000000000000000000000000000000..ce1c0c919667df63c26fd8d73b05f88447b0ab14
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_reinstall.rb
@@ -0,0 +1,15 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestReinstall < IntegrationCommandTests
+  def test_reinstall
+    setup_test_formula "testball"
+
+    cmd("install", "testball", "--with-foo")
+    foo_dir = HOMEBREW_CELLAR/"testball/0.1/foo"
+    assert foo_dir.exist?
+    foo_dir.rmtree
+    assert_match "Reinstalling testball with --with-foo",
+      cmd("reinstall", "testball")
+    assert foo_dir.exist?
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_reinstall_pinned.rb b/Library/Homebrew/test/test_integration_cmds_reinstall_pinned.rb
new file mode 100644
index 0000000000000000000000000000000000000000..dc4695e408964b7e440f8004df61220568aee19b
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_reinstall_pinned.rb
@@ -0,0 +1,15 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestReinstallPinned < IntegrationCommandTests
+  def test_reinstall_pinned
+    setup_test_formula "testball"
+
+    HOMEBREW_CELLAR.join("testball/0.1").mkpath
+    HOMEBREW_PINNED_KEGS.mkpath
+    FileUtils.ln_s HOMEBREW_CELLAR.join("testball/0.1"), HOMEBREW_PINNED_KEGS/"testball"
+
+    assert_match "testball is pinned. You must unpin it to reinstall.", cmd("reinstall", "testball")
+
+    HOMEBREW_PINNED_KEGS.rmtree
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_repository.rb b/Library/Homebrew/test/test_integration_cmds_repository.rb
new file mode 100644
index 0000000000000000000000000000000000000000..a90dc1814aac587210cf2c497509730eddb36432
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_repository.rb
@@ -0,0 +1,10 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestRepository < IntegrationCommandTests
+  def test_repository
+    assert_match HOMEBREW_REPOSITORY.to_s,
+                 cmd("--repository")
+    assert_match "#{HOMEBREW_LIBRARY}/Taps/foo/homebrew-bar",
+                 cmd("--repository", "foo/bar")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_search.rb b/Library/Homebrew/test/test_integration_cmds_search.rb
new file mode 100644
index 0000000000000000000000000000000000000000..f85d1d67e40c930985bbf31f7e877fed590dfd4c
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_search.rb
@@ -0,0 +1,30 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestSearch < IntegrationCommandTests
+  def test_search
+    setup_test_formula "testball"
+    desc_cache = HOMEBREW_CACHE/"desc_cache.json"
+    refute_predicate desc_cache, :exist?, "Cached file should not exist"
+
+    assert_match "testball", cmd("search")
+    assert_match "testball", cmd("search", "testball")
+    assert_match "testball", cmd("search", "homebrew/homebrew-core/testball")
+    assert_match "testball", cmd("search", "--desc", "Some test")
+
+    flags = {
+      "macports" => "https://www.macports.org/ports.php?by=name&substr=testball",
+      "fink" => "http://pdb.finkproject.org/pdb/browse.php?summary=testball",
+      "debian" => "https://packages.debian.org/search?keywords=testball&searchon=names&suite=all&section=all",
+      "opensuse" => "https://software.opensuse.org/search?q=testball",
+      "fedora" => "https://admin.fedoraproject.org/pkgdb/packages/%2Atestball%2A/",
+      "ubuntu" => "http://packages.ubuntu.com/search?keywords=testball&searchon=names&suite=all&section=all",
+    }
+
+    flags.each do |flag, url|
+      assert_equal url, cmd("search", "--#{flag}",
+        "testball", "HOMEBREW_BROWSER" => "echo")
+    end
+
+    assert_predicate desc_cache, :exist?, "Cached file should exist"
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_services.rb b/Library/Homebrew/test/test_integration_cmds_services.rb
new file mode 100644
index 0000000000000000000000000000000000000000..043b5b0d6f81a8e71ec24e725adc94448ddcf641
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_services.rb
@@ -0,0 +1,11 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestServices < IntegrationCommandTests
+  def test_services
+    needs_test_cmd_taps
+    needs_macos
+    setup_remote_tap("homebrew/services")
+    assert_equal "Warning: No services available to control with `brew services`",
+      cmd("services", "list")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_sh.rb b/Library/Homebrew/test/test_integration_cmds_sh.rb
new file mode 100644
index 0000000000000000000000000000000000000000..be9e119c524519c3d2108e87f92bb2615bd92307
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_sh.rb
@@ -0,0 +1,8 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestSh < IntegrationCommandTests
+  def test_sh
+    assert_match "Your shell has been configured",
+                 cmd("sh", "SHELL" => which("true"))
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_switch.rb b/Library/Homebrew/test/test_integration_cmds_switch.rb
new file mode 100644
index 0000000000000000000000000000000000000000..50b636d14a56a955bc40f3974304424c287fdca5
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_switch.rb
@@ -0,0 +1,20 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestSwitch < IntegrationCommandTests
+  def test_switch
+    assert_match "Usage: brew switch <name> <version>", cmd_fail("switch")
+    assert_match "testball not found", cmd_fail("switch", "testball", "0.1")
+
+    setup_test_formula "testball", <<-EOS.undent
+      keg_only "just because"
+    EOS
+
+    cmd("install", "testball")
+    testball_rack = HOMEBREW_CELLAR/"testball"
+    FileUtils.cp_r testball_rack/"0.1", testball_rack/"0.2"
+
+    cmd("switch", "testball", "0.2")
+    assert_match "testball does not have a version \"0.3\"",
+      cmd_fail("switch", "testball", "0.3")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_tap.rb b/Library/Homebrew/test/test_integration_cmds_tap.rb
new file mode 100644
index 0000000000000000000000000000000000000000..22cfd8e93b549cd0d9e139f33db9c4a4b2e0ca03
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_tap.rb
@@ -0,0 +1,30 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestTap < IntegrationCommandTests
+  def test_tap
+    path = Tap::TAP_DIRECTORY/"homebrew/homebrew-foo"
+    path.mkpath
+    path.cd do
+      shutup do
+        system "git", "init"
+        system "git", "remote", "add", "origin", "https://github.com/Homebrew/homebrew-foo"
+        FileUtils.touch "readme"
+        system "git", "add", "--all"
+        system "git", "commit", "-m", "init"
+      end
+    end
+
+    assert_match "homebrew/foo", cmd("tap")
+    assert_match "homebrew/versions", cmd("tap", "--list-official")
+    assert_match "2 taps", cmd("tap-info")
+    assert_match "https://github.com/Homebrew/homebrew-foo", cmd("tap-info", "homebrew/foo")
+    assert_match "https://github.com/Homebrew/homebrew-foo", cmd("tap-info", "--json=v1", "--installed")
+    assert_match "Pinned homebrew/foo", cmd("tap-pin", "homebrew/foo")
+    assert_match "homebrew/foo", cmd("tap", "--list-pinned")
+    assert_match "Unpinned homebrew/foo", cmd("tap-unpin", "homebrew/foo")
+    assert_match "Tapped", cmd("tap", "homebrew/bar", path/".git")
+    assert_match "Untapped", cmd("untap", "homebrew/bar")
+    assert_equal "", cmd("tap", "homebrew/bar", path/".git", "-q", "--full")
+    assert_match "Untapped", cmd("untap", "homebrew/bar")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_tap_readme.rb b/Library/Homebrew/test/test_integration_cmds_tap_readme.rb
new file mode 100644
index 0000000000000000000000000000000000000000..c1f53c42d251bb810e787a4093399684183a16c7
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_tap_readme.rb
@@ -0,0 +1,10 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestTapReadme < IntegrationCommandTests
+  def test_tap_readme
+    assert_match "brew install homebrew/foo/<formula>",
+                 cmd("tap-readme", "foo", "--verbose")
+    readme = HOMEBREW_LIBRARY/"Taps/homebrew/homebrew-foo/README.md"
+    assert readme.exist?, "The README should be created"
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_test_formula.rb b/Library/Homebrew/test/test_integration_cmds_test_formula.rb
new file mode 100644
index 0000000000000000000000000000000000000000..4350fdbe9d06472b3f0990a662d4d9d1f379efe2
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_test_formula.rb
@@ -0,0 +1,30 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestTestFormula < IntegrationCommandTests
+  def test_test_formula
+    assert_match "This command requires a formula argument", cmd_fail("test")
+    assert_match "Testing requires the latest version of testball",
+      cmd_fail("test", testball)
+
+    cmd("install", testball)
+    assert_match "testball defines no test", cmd_fail("test", testball)
+
+    setup_test_formula "testball_copy", <<-EOS.undent
+      head "https://github.com/example/testball2.git"
+
+      devel do
+        url "file://#{File.expand_path("..", __FILE__)}/tarballs/testball-0.1.tbz"
+        sha256 "#{TESTBALL_SHA256}"
+      end
+
+      keg_only "just because"
+
+      test do
+      end
+    EOS
+
+    cmd("install", "testball_copy")
+    assert_match "Testing testball_copy", cmd("test", "--HEAD", "testball_copy")
+    assert_match "Testing testball_copy", cmd("test", "--devel", "testball_copy")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_uninstall.rb b/Library/Homebrew/test/test_integration_cmds_uninstall.rb
new file mode 100644
index 0000000000000000000000000000000000000000..6f82bedc771b03ef5314d5c9b5e5946b865ab280
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_uninstall.rb
@@ -0,0 +1,8 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestUninstall < IntegrationCommandTests
+  def test_uninstall
+    cmd("install", testball)
+    assert_match "Uninstalling testball", cmd("uninstall", "--force", testball)
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_unlink.rb b/Library/Homebrew/test/test_integration_cmds_unlink.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b64cc81406591d3d87ab9cdb866b1c41e3923695
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_unlink.rb
@@ -0,0 +1,10 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestUnlink < IntegrationCommandTests
+  def test_unlink
+    setup_test_formula "testball"
+
+    cmd("install", "testball")
+    assert_match "Would remove", cmd("unlink", "--dry-run", "testball")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_unlinkapps.rb b/Library/Homebrew/test/test_integration_cmds_unlinkapps.rb
new file mode 100644
index 0000000000000000000000000000000000000000..047f17a1da523547cf4c31be09f8734532b801bf
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_unlinkapps.rb
@@ -0,0 +1,19 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestUnlinkapps < IntegrationCommandTests
+  def test_unlinkapps
+    home_dir = Pathname.new(mktmpdir)
+    apps_dir = home_dir/"Applications"
+    apps_dir.mkpath
+
+    setup_test_formula "testball"
+
+    source_app = (HOMEBREW_CELLAR/"testball/0.1/TestBall.app")
+    source_app.mkpath
+
+    FileUtils.ln_s source_app, "#{apps_dir}/TestBall.app"
+
+    assert_match "Unlinking: #{apps_dir}/TestBall.app",
+      cmd("unlinkapps", "--local", "HOME" => home_dir)
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_unpack.rb b/Library/Homebrew/test/test_integration_cmds_unpack.rb
new file mode 100644
index 0000000000000000000000000000000000000000..1b6e97e52de56425e1db23e566affc9e98c8017a
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_unpack.rb
@@ -0,0 +1,13 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestUnpack < IntegrationCommandTests
+  def test_unpack
+    setup_test_formula "testball"
+
+    mktmpdir do |path|
+      cmd "unpack", "testball", "--destdir=#{path}"
+      assert File.directory?("#{path}/testball-0.1"),
+        "The tarball should be unpacked"
+    end
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_upgrade.rb b/Library/Homebrew/test/test_integration_cmds_upgrade.rb
new file mode 100644
index 0000000000000000000000000000000000000000..5eee33d56ba75b0acaf5b349ac7ac918ff7ef070
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_upgrade.rb
@@ -0,0 +1,12 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestUpgrade < IntegrationCommandTests
+  def test_upgrade
+    setup_test_formula "testball"
+    (HOMEBREW_CELLAR/"testball/0.0.1/foo").mkpath
+
+    cmd("upgrade")
+    assert((HOMEBREW_CELLAR/"testball/0.1").directory?,
+      "The latest version directory should be created")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_uses.rb b/Library/Homebrew/test/test_integration_cmds_uses.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e5c0c0f770066a27c2f0d561259cb52c67ce3432
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_uses.rb
@@ -0,0 +1,16 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestUses < IntegrationCommandTests
+  def test_uses
+    setup_test_formula "foo"
+    setup_test_formula "bar"
+    setup_test_formula "baz", <<-EOS.undent
+      url "https://example.com/baz-1.0"
+      depends_on "bar"
+    EOS
+
+    assert_equal "", cmd("uses", "baz")
+    assert_equal "baz", cmd("uses", "bar")
+    assert_equal "bar\nbaz", cmd("uses", "--recursive", "foo")
+  end
+end
diff --git a/Library/Homebrew/test/test_integration_cmds_version.rb b/Library/Homebrew/test/test_integration_cmds_version.rb
new file mode 100644
index 0000000000000000000000000000000000000000..b434d0d955ed166133329f3fb1acf35bf98f81e5
--- /dev/null
+++ b/Library/Homebrew/test/test_integration_cmds_version.rb
@@ -0,0 +1,8 @@
+require "integration_cmds_tests"
+
+class IntegrationCommandTestVersion < IntegrationCommandTests
+  def test_version
+    assert_match HOMEBREW_VERSION.to_s,
+                 cmd("--version")
+  end
+end