synor/sdk/ruby/test/test_tensor.rb
Gulshan Yadav e2a3b66123 test(sdk): add comprehensive unit tests for all SDKs
Adds unit tests covering tensor operations, type enums, client
functionality, and serialization for all 12 SDK implementations:

- JavaScript (Vitest): tensor, types, client tests
- Python (pytest): tensor, types, client tests
- Go: standard library tests with httptest
- Flutter (flutter_test): tensor, types tests
- Java (JUnit 5): tensor, types tests
- Rust: embedded module tests
- Ruby (minitest): tensor, types tests
- C# (xUnit): tensor, types tests

Tests cover:
- Tensor creation (zeros, ones, random, randn, eye, arange, linspace)
- Tensor operations (reshape, transpose, indexing)
- Reductions (sum, mean, std, min, max)
- Activations (relu, sigmoid, softmax)
- Serialization/deserialization
- Type enums and configuration
- Client request building
- Error handling
2026-01-11 17:56:11 +05:30

117 lines
3.1 KiB
Ruby

# frozen_string_literal: true
require 'minitest/autorun'
require_relative '../lib/synor_compute'
class TestTensor < Minitest::Test
def test_creation
tensor = SynorCompute::Tensor.new([2, 3], [1.0, 2.0, 3.0, 4.0, 5.0, 6.0])
assert_equal [2, 3], tensor.shape
assert_equal 6, tensor.size
assert_equal 2, tensor.ndim
end
def test_zeros
tensor = SynorCompute::Tensor.zeros([3, 4])
assert_equal [3, 4], tensor.shape
assert_equal 12, tensor.size
assert tensor.data.all? { |v| v == 0.0 }
end
def test_ones
tensor = SynorCompute::Tensor.ones([2, 2])
assert tensor.data.all? { |v| v == 1.0 }
end
def test_random
tensor = SynorCompute::Tensor.rand([10, 10])
assert_equal [10, 10], tensor.shape
assert tensor.data.all? { |v| v >= 0 && v < 1 }
end
def test_randn
tensor = SynorCompute::Tensor.randn([1000])
mean = tensor.mean
std = tensor.std
assert mean.abs < 0.2, "Mean should be close to 0, got #{mean}"
assert std > 0.8 && std < 1.2, "Std should be close to 1, got #{std}"
end
def test_eye
tensor = SynorCompute::Tensor.eye(3)
assert_equal [3, 3], tensor.shape
assert_equal 1.0, tensor[[0, 0]]
assert_equal 1.0, tensor[[1, 1]]
assert_equal 0.0, tensor[[0, 1]]
end
def test_arange
tensor = SynorCompute::Tensor.arange(0, 5, 1)
assert_equal [5], tensor.shape
assert_equal 0.0, tensor[[0]]
assert_equal 4.0, tensor[[4]]
end
def test_linspace
tensor = SynorCompute::Tensor.linspace(0, 10, 11)
assert_equal [11], tensor.shape
assert_in_delta 0.0, tensor[[0]], 0.0001
assert_in_delta 10.0, tensor[[10]], 0.0001
end
def test_reshape
tensor = SynorCompute::Tensor.new([6], [1, 2, 3, 4, 5, 6])
reshaped = tensor.reshape([2, 3])
assert_equal [2, 3], reshaped.shape
assert_equal 6, reshaped.size
end
def test_transpose
tensor = SynorCompute::Tensor.new([2, 3], [1, 2, 3, 4, 5, 6])
transposed = tensor.transpose
assert_equal [3, 2], transposed.shape
end
def test_sum
tensor = SynorCompute::Tensor.new([4], [1, 2, 3, 4])
assert_equal 10.0, tensor.sum
end
def test_mean
tensor = SynorCompute::Tensor.new([4], [1, 2, 3, 4])
assert_equal 2.5, tensor.mean
end
def test_min_max
tensor = SynorCompute::Tensor.new([4], [3, 1, 4, 2])
assert_equal 1.0, tensor.min
assert_equal 4.0, tensor.max
end
def test_relu
tensor = SynorCompute::Tensor.new([5], [-2, -1, 0, 1, 2])
result = tensor.relu
assert_equal [0, 0, 0, 1, 2], result.data
end
def test_sigmoid
tensor = SynorCompute::Tensor.new([1], [0])
result = tensor.sigmoid
assert_in_delta 0.5, result[[0]], 0.0001
end
def test_softmax
tensor = SynorCompute::Tensor.new([3], [1, 2, 3])
result = tensor.softmax
assert_in_delta 1.0, result.sum, 0.0001
assert result[[2]] > result[[1]]
end
def test_serialization
original = SynorCompute::Tensor.new([2, 3], [1, 2, 3, 4, 5, 6])
json = original.to_json
restored = SynorCompute::Tensor.from_json(json)
assert_equal original.shape, restored.shape
assert_equal original.data, restored.data
end
end