/*
 *
 * Copyright 2017 gRPC authors.
 *
 * 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 codes

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

	cpb "google.golang.org/genproto/googleapis/rpc/code"
)

func TestUnmarshalJSON(t *testing.T) {
	for s, v := range cpb.Code_value {
		want := Code(v)
		var got Code
		if err := got.UnmarshalJSON([]byte(`"` + s + `"`)); err != nil || got != want {
			t.Errorf("got.UnmarshalJSON(%q) = %v; want <nil>.  got=%v; want %v", s, err, got, want)
		}
	}
}

func TestJSONUnmarshal(t *testing.T) {
	var got []Code
	want := []Code{OK, NotFound, Internal, Canceled}
	in := `["OK", "NOT_FOUND", "INTERNAL", "CANCELLED"]`
	err := json.Unmarshal([]byte(in), &got)
	if err != nil || !reflect.DeepEqual(got, want) {
		t.Fatalf("json.Unmarshal(%q, &got) = %v; want <nil>.  got=%v; want %v", in, err, got, want)
	}
}

func TestUnmarshalJSON_NilReceiver(t *testing.T) {
	var got *Code
	in := OK.String()
	if err := got.UnmarshalJSON([]byte(in)); err == nil {
		t.Errorf("got.UnmarshalJSON(%q) = nil; want <non-nil>.  got=%v", in, got)
	}
}

func TestUnmarshalJSON_UnknownInput(t *testing.T) {
	var got Code
	for _, in := range [][]byte{[]byte(""), []byte("xxx"), []byte("Code(17)"), nil} {
		if err := got.UnmarshalJSON([]byte(in)); err == nil {
			t.Errorf("got.UnmarshalJSON(%q) = nil; want <non-nil>.  got=%v", in, got)
		}
	}
}
