// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package main

import (
	"fmt"
	"regexp"
	"testing"
)

func TestRemovePrintCmdlineArg(t *testing.T) {
	withTestContext(t, func(ctx *testContext) {
		cmd := ctx.must(callCompiler(ctx, ctx.cfg, ctx.newCommand(gccX86_64, "-print-cmdline", mainCc)))
		if err := verifyArgCount(cmd, 0, "-print-cmdline"); err != nil {
			t.Error(err)
		}
	})
}

func TestPrintCompilerCommand(t *testing.T) {
	withTestContext(t, func(ctx *testContext) {
		ctx.must(callCompiler(ctx, ctx.cfg, ctx.newCommand(gccX86_64, "-print-cmdline", mainCc)))
		if matched, _ := regexp.MatchString(`cd '.*' && '.*/x86_64-cros-linux-gnu-gcc.real'.*'main.cc'`, ctx.stderrString()); !matched {
			t.Errorf("sub command not printed to stderr. Got: %s", ctx.stderrString())
		}
	})
}

func TestPrintNestedCommand(t *testing.T) {
	withTestContext(t, func(ctx *testContext) {
		// Note: -clang-syntax calls clang to check the syntax
		ctx.must(callCompiler(ctx, ctx.cfg, ctx.newCommand(gccX86_64, "-print-cmdline", "-clang-syntax", mainCc)))
		if matched, _ := regexp.MatchString(`cd '.*' && '.*usr/bin/clang'.*'main.cc'.*'-fsyntax-only'`, ctx.stderrString()); !matched {
			t.Errorf("sub command not printed to stderr. Got: %s", ctx.stderrString())
		}
	})
}

func TestPrintCmdWd(t *testing.T) {
	withTestContext(t, func(ctx *testContext) {
		printCmd(ctx, &command{
			Path: "/somepath",
		})
		if ctx.stderrString() != fmt.Sprintf("cd '%s' && '/somepath'\n", ctx.tempDir) {
			t.Errorf("unexpected result. Got: %s", ctx.stderrString())
		}
	})
}

func TestPrintCmdAbsolutePath(t *testing.T) {
	withTestContext(t, func(ctx *testContext) {
		printCmd(ctx, &command{
			Path: "somepath",
		})
		if ctx.stderrString() != fmt.Sprintf("cd '%s' && '%s/somepath'\n", ctx.tempDir, ctx.tempDir) {
			t.Errorf("unexpected result. Got: %s", ctx.stderrString())
		}
	})
}

func TestPrintCmdEnvUpdates(t *testing.T) {
	withTestContext(t, func(ctx *testContext) {
		printCmd(ctx, &command{
			Path:       "/somepath",
			EnvUpdates: []string{"a=b"},
		})
		if ctx.stderrString() != fmt.Sprintf("cd '%s' && env 'a=b' '/somepath'\n", ctx.tempDir) {
			t.Errorf("unexpected result. Got: %s", ctx.stderrString())
		}
	})
}

func TestPrintCmdArgs(t *testing.T) {
	withTestContext(t, func(ctx *testContext) {
		printCmd(ctx, &command{
			Path: "/somepath",
			Args: []string{"-a"},
		})
		if ctx.stderrString() != fmt.Sprintf("cd '%s' && '/somepath' '-a'\n", ctx.tempDir) {
			t.Errorf("unexpected result. Got: %s", ctx.stderrString())
		}
	})
}
