#!/usr/bin/ruby

require 'google/protobuf'
require 'service_test_pb'
require 'test/unit'
require 'json'

class ServiceTest < Test::Unit::TestCase
  def setup
    @test_service = Google::Protobuf::DescriptorPool.generated_pool.lookup('service_test_protos.TestService')
    @deprecated_service = Google::Protobuf::DescriptorPool.generated_pool.lookup('service_test_protos.DeprecatedService')
    @test_service_methods = @test_service.to_h { |method| [method.name, method] }
  end

  def test_lookup_service_descriptor
    assert_kind_of Google::Protobuf::ServiceDescriptor, @test_service
    assert_equal 'service_test_protos.TestService', @test_service.name
  end

  def test_file_descriptor
    assert_kind_of Google::Protobuf::FileDescriptor, @test_service.file_descriptor
    assert_equal 'service_test.proto', @test_service.file_descriptor.name
  end

  def test_method_iteration
    @test_service.each { |method| assert_kind_of Google::Protobuf::MethodDescriptor, method }
    assert_equal %w(UnaryOne UnaryTwo), @test_service.map { |method| method.name }.first(2)
  end

  def test_service_options
    assert @deprecated_service.options.deprecated
    refute @test_service.options.deprecated
  end

  def test_service_options_extensions
    extension_field = Google::Protobuf::DescriptorPool.generated_pool.lookup('service_test_protos.test_options')
    assert_equal 8325, extension_field.get(@test_service.options).int_option_value
  end

  def test_method_options
    assert_equal :IDEMPOTENT, @test_service_methods['IdempotentMethod'].options.idempotency_level
    assert_equal :NO_SIDE_EFFECTS, @test_service_methods['PureMethod'].options.idempotency_level
  end

  def test_method_input_type
    unary_request_type = Google::Protobuf::DescriptorPool.generated_pool.lookup('service_test_protos.UnaryRequestType')
    assert_same unary_request_type, @test_service_methods['UnaryOne'].input_type
  end

  def test_method_output_type
    unary_response_type = Google::Protobuf::DescriptorPool.generated_pool.lookup('service_test_protos.UnaryResponseType')
    assert_same unary_response_type, @test_service_methods['UnaryOne'].output_type
  end

  def test_method_streaming_flags
    refute @test_service_methods['UnaryOne'].client_streaming
    refute @test_service_methods['UnaryOne'].server_streaming
    assert @test_service_methods['StreamingMethod'].client_streaming
    assert @test_service_methods['StreamingMethod'].server_streaming
  end
end
