// Copyright 2020 Google LLC
//
// 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
//
//     https://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.

// Code generated by gapic-generator. DO NOT EDIT.

package vision

import (
	"context"
	"fmt"
	"strconv"
	"testing"
	"time"

	"cloud.google.com/go/internal/testutil"
	"google.golang.org/api/iterator"
	"google.golang.org/api/option"
	visionpb "google.golang.org/genproto/googleapis/cloud/vision/v1p1beta1"
)

var _ = fmt.Sprintf
var _ = iterator.Done
var _ = strconv.FormatUint
var _ = time.Now

func TestImageAnnotatorSmoke(t *testing.T) {
	if testing.Short() {
		t.Skip("skipping smoke test in short mode")
	}
	ctx := context.Background()
	ts := testutil.TokenSource(ctx, DefaultAuthScopes()...)
	if ts == nil {
		t.Skip("Integration tests skipped. See CONTRIBUTING.md for details")
	}

	projectId := testutil.ProjID()
	_ = projectId

	c, err := NewImageAnnotatorClient(ctx, option.WithTokenSource(ts))
	if err != nil {
		t.Fatal(err)
	}

	var gcsImageUri string = "gs://cloud-samples-data/vision/face_detection/celebrity_recognition/sergey.jpg"
	var source = &visionpb.ImageSource{
		GcsImageUri: gcsImageUri,
	}
	var image = &visionpb.Image{
		Source: source,
	}
	var type_ visionpb.Feature_Type = visionpb.Feature_FACE_DETECTION
	var featuresElement = &visionpb.Feature{
		Type: type_,
	}
	var features = []*visionpb.Feature{featuresElement}
	var requestsElement = &visionpb.AnnotateImageRequest{
		Image:    image,
		Features: features,
	}
	var requests = []*visionpb.AnnotateImageRequest{requestsElement}
	var request = &visionpb.BatchAnnotateImagesRequest{
		Requests: requests,
	}

	if _, err := c.BatchAnnotateImages(ctx, request); err != nil {
		t.Error(err)
	}
}
