// Copyright 2017 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package ctags

import (
	"bufio"
	"os/exec"
	"reflect"
	"strings"
	"testing"

	"github.com/google/go-cmp/cmp"
)

func TestJSON(t *testing.T) {
	if _, err := exec.LookPath("universal-ctags"); err != nil {
		t.Skip(err)
	}

	p, err := newProcess("universal-ctags")
	if err != nil {
		t.Fatal("newProcess", err)
	}

	defer p.Close()

	java := `
package io.zoekt;
import java.util.concurrent.Future;
class Back implements Future extends Frob {
  public static int BLA = 1;
  public int member;
  public Back() {
    member = 2;
  }
  public int method() {
    member++;
  }
}
`
	name := "io/zoekt/Back.java"
	got, err := p.Parse(name, []byte(java))
	if err != nil {
		t.Errorf("Process: %v", err)
	}

	want := []*Entry{
		{
			Sym:      "io.zoekt",
			Kind:     "package",
			Language: "Java",
			Path:     "io/zoekt/Back.java",
			Line:     2,
		},
		{
			Sym:      "Back",
			Path:     "io/zoekt/Back.java",
			Line:     4,
			Language: "Java",
			Kind:     "class",
		},

		{
			Sym:      "BLA",
			Path:     "io/zoekt/Back.java",
			Line:     5,
			Kind:     "field",
			Language: "Java",
		},
		{
			Sym:      "member",
			Path:     "io/zoekt/Back.java",
			Line:     6,
			Language: "Java",
			Kind:     "field",
		},
		{
			Sym:      "Back",
			Path:     "io/zoekt/Back.java",
			Language: "Java",
			Line:     7,
			Kind:     "method",
		},
		{
			Sym:      "method",
			Language: "Java",
			Path:     "io/zoekt/Back.java",
			Line:     10,
			Kind:     "method",
		},
	}

	for i := range want {
		if !reflect.DeepEqual(got[i], want[i]) {
			t.Fatalf("got %#v, want %#v", got[i], want[i])
		}
	}
}

func TestScanner(t *testing.T) {
	size := 20

	input := strings.Join([]string{
		"aaaaaaaaa",
		strings.Repeat("B", 3*size+3),
		strings.Repeat("C", size) + strings.Repeat("D", size+1),
		"",
		strings.Repeat("e", size-1),
		"f\r",
		"gg",
	}, "\n")
	want := []string{
		"aaaaaaaaa",
		strings.Repeat("e", size-1),
		"f",
		"gg",
	}

	var got []string
	r := &scanner{r: bufio.NewReaderSize(strings.NewReader(input), size)}
	for r.Scan() {
		got = append(got, string(r.Bytes()))
	}
	if err := r.Err(); err != nil {
		t.Fatal(err)
	}

	if !cmp.Equal(got, want) {
		t.Errorf("mismatch (-want +got):\n%s", cmp.Diff(want, got))
	}
}
