// Copyright 2016 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 gitiles

import (
	"encoding/json"
	"reflect"
	"testing"
)

func TestTypes(t *testing.T) {
	type testCase struct {
		in   string
		want interface{}
		got  interface{}
	}

	cases := []testCase{
		{
			in: `{
  "id": "0d1df06d6de43086af19990f85b7b7c01799f984",
  "entries": [
    {
      "mode": 33188,
      "type": "blob",
      "id": "582b4959fa1f8e90330027291c612b1cebc4447c",
      "name": "index.html"
    }
  ]
}`,
			got: &Tree{},
			want: &Tree{
				ID: "0d1df06d6de43086af19990f85b7b7c01799f984",
				Entries: []TreeEntry{
					{
						Mode: 33188,
						Type: "blob",
						ID:   "582b4959fa1f8e90330027291c612b1cebc4447c",
						Name: "index.html",
					},
				},
			},
		},
		{
			in: `{
  "name": "gerrit",
  "clone_url": "file:///home/hanwen/vc/gerrit"
}`,
			want: &Project{Name: "gerrit",
				CloneURL: "file:///home/hanwen/vc/gerrit",
			},
			got: &Project{},
		},
		{
			in: `{
			"name": "Han-Wen Nienhuys",
			"email": "hanwen@google.com",
			"time": "Fri Feb 26 14:29:31 2016 +0100"
}`,
			want: &Person{
				Name:  "Han-Wen Nienhuys",
				Email: "hanwen@google.com",
				Time:  "Fri Feb 26 14:29:31 2016 +0100",
				//time.Date(2016, 2, 26, 14, 29, 31, 0, euTZ),
			},
			got: &Person{},
		},
		{
			in: `{
      "type": "modify",
      "old_id": "7d3569881e6dcc4745e853ecc8b9a570f3431060",
      "old_mode": 33188,
      "old_path": "polygerrit-ui/app/elements/gr-account-label.html",
      "new_id": "3f795d0d84716842d319fcf359b553e024a6b811",
      "new_mode": 33188,
      "new_path": "polygerrit-ui/app/elements/gr-account-label.html"
    }`,
			want: &DiffEntry{
				Type:    "modify",
				OldID:   "7d3569881e6dcc4745e853ecc8b9a570f3431060",
				OldMode: 33188,
				OldPath: "polygerrit-ui/app/elements/gr-account-label.html",
				NewID:   "3f795d0d84716842d319fcf359b553e024a6b811",
				NewMode: 33188,
				NewPath: "polygerrit-ui/app/elements/gr-account-label.html",
			},
			got: &DiffEntry{},
		},

		{
			in: `{
  "commit": "5378eff7b783acd83f2241983f9f97ccf9972d37",
  "tree": "868c42f4579291a85689c3def16cb146877af155",
  "parents": [
    "6233c1a23921c24be2c099fd21f7ea5e029e3777"
  ],
  "author": {
    "name": "Han-Wen Nienhuys",
    "email": "hanwen@google.com",
    "time": "Fri Feb 26 14:29:31 2016 +0100"
  },
  "committer": {
    "name": "Han-Wen Nienhuys",
    "email": "hanwen@google.com",
    "time": "Thu Mar 03 14:12:41 2016 +0100"
  },
  "message": "PolyGerrit: inject \"remove reviewer\" into gr-account-label\n\nThis makes gr-account-label into a \"chip\".\n\nBug: Issue \u003c3917\u003e\nChange-Id: Ibe4d62786b0625bad34e651b715a2085c4a2da51\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "7d3569881e6dcc4745e853ecc8b9a570f3431060",
      "old_mode": 33188,
      "old_path": "polygerrit-ui/app/elements/gr-account-label.html",
      "new_id": "3f795d0d84716842d319fcf359b553e024a6b811",
      "new_mode": 33188,
      "new_path": "polygerrit-ui/app/elements/gr-account-label.html"
    }
  ]
}`,
			want: &Commit{
				Commit: "5378eff7b783acd83f2241983f9f97ccf9972d37",
				Tree:   "868c42f4579291a85689c3def16cb146877af155",
				Parents: []string{
					"6233c1a23921c24be2c099fd21f7ea5e029e3777",
				},
				Author: Person{
					Name:  "Han-Wen Nienhuys",
					Email: "hanwen@google.com",
					Time:  "Fri Feb 26 14:29:31 2016 +0100",
				},
				Committer: Person{
					Name:  "Han-Wen Nienhuys",
					Email: "hanwen@google.com",
					Time:  "Thu Mar 03 14:12:41 2016 +0100",
				},
				Message: "PolyGerrit: inject \"remove reviewer\" into gr-account-label\n\nThis makes gr-account-label into a \"chip\".\n\nBug: Issue \u003c3917\u003e\nChange-Id: Ibe4d62786b0625bad34e651b715a2085c4a2da51\n",
				TreeDiff: []DiffEntry{
					{
						Type:    "modify",
						OldID:   "7d3569881e6dcc4745e853ecc8b9a570f3431060",
						OldMode: 33188,
						OldPath: "polygerrit-ui/app/elements/gr-account-label.html",
						NewID:   "3f795d0d84716842d319fcf359b553e024a6b811",
						NewMode: 33188,
						NewPath: "polygerrit-ui/app/elements/gr-account-label.html",
					},
				},
			},
			got: &Commit{},
		},
		{
			in: `{
  "log": [
    {
      "commit": "5378eff7b783acd83f2241983f9f97ccf9972d37",
      "tree": "868c42f4579291a85689c3def16cb146877af155",
      "parents": [
        "6233c1a23921c24be2c099fd21f7ea5e029e3777"
      ],
      "author": {
        "name": "Han-Wen Nienhuys",
        "email": "hanwen@google.com",
        "time": "Fri Feb 26 14:29:31 2016 +0100"
      },
      "committer": {
        "name": "Han-Wen Nienhuys",
        "email": "hanwen@google.com",
        "time": "Thu Mar 03 14:12:41 2016 +0100"
      },
      "message": "PolyGerrit: inject \"remove reviewer\" into gr-account-label\n\nThis makes gr-account-label into a \"chip\".\n\nBug: Issue \u003c3917\u003e\nChange-Id: Ibe4d62786b0625bad34e651b715a2085c4a2da51\n"
    }
  ],
  "next": "c32abd0104868f6d798348fa74cff420124deb0e"
}`,
			got: &Log{},
			want: &Log{
				Log: []Commit{
					{
						Commit: "5378eff7b783acd83f2241983f9f97ccf9972d37",
						Tree:   "868c42f4579291a85689c3def16cb146877af155",
						Parents: []string{
							"6233c1a23921c24be2c099fd21f7ea5e029e3777",
						}, Author: Person{
							Name:  "Han-Wen Nienhuys",
							Email: "hanwen@google.com",
							Time:  "Fri Feb 26 14:29:31 2016 +0100",
						},
						Committer: Person{
							Name:  "Han-Wen Nienhuys",
							Email: "hanwen@google.com",
							Time:  "Thu Mar 03 14:12:41 2016 +0100",
						},
						Message: "PolyGerrit: inject \"remove reviewer\" into gr-account-label\n\nThis makes gr-account-label into a \"chip\".\n\nBug: Issue \u003c3917\u003e\nChange-Id: Ibe4d62786b0625bad34e651b715a2085c4a2da51\n",
					},
				},
				Next: "c32abd0104868f6d798348fa74cff420124deb0e",
			},
		},

		{
			in: `{
      "start": 1,
      "count": 4,
      "path": "VERSION",
      "commit": "3765bb8add118be67b4b0ac6528661e66ac63264",
      "author": {
        "name": "Shawn Pearce",
        "email": "sop@google.com",
        "time": "2013-07-29 14:05:26 -0700"
      }
    }`,
			want: &BlameRegion{
				Start:  1,
				Count:  4,
				Path:   "VERSION",
				Commit: "3765bb8add118be67b4b0ac6528661e66ac63264",
				Author: Person{
					Name:  "Shawn Pearce",
					Email: "sop@google.com",
					Time:  "2013-07-29 14:05:26 -0700",
				},
			},
			got: &BlameRegion{},
		},
		{
			in: `{
  "accessories/manifest": {
    "name": "accessories/manifest",
    "clone_url": "https://android.googlesource.com/accessories/manifest"
  }
}
`,
			want: &map[string]*Project{
				"accessories/manifest": &Project{
					Name:     "accessories/manifest",
					CloneURL: "https://android.googlesource.com/accessories/manifest",
				}},
			got: &map[string]*Project{},
		},
	}

	for _, c := range cases {
		if err := json.Unmarshal([]byte(c.in), c.got); err != nil {
			t.Errorf("%T: unmarshalGitiles: %v", c.want, err)
		} else if !reflect.DeepEqual(c.got, c.want) {
			t.Errorf("%T: got %#v, want %#v", c.want, c.got, c.want)
		}
	}
}
