class Calculator
  def initialize(initial_value = 0)
    @result = initial_value
  end

  def add(a, b)
    @result = a + b
  end
end


RSpec.describe Calculator do
  subject { Calculator.new(10) }

  describe "#add" do
    it "returns the sum of two numbers" do
      subject.add(3, 4)
      # eq - проверяет на равенство
      expect(subject.result).to eq(17)
      # be - проверяет на идентичность (обычно используется для чисел и символов)
      expect(subject.result).to be == 17
      # eql - проверяет на равенство значений и типов
      expect(subject.result).to eql(17)
      # equal - проверяет на идентичность объектов
      expect(subject.result).to equal(subject.result)
      # be_truthy - проверяет, что значение истинно (не nil и не false)
      expect(subject.result).to be_truthy
      # be_falsey - проверяет, что значение ложно (nil или false)
      expect(subject.result).not_to be_falsey
      # be_nil - проверяет, что значение nil
      expect(subject.result).not_to be_nil
      # be_between - проверяет, что значение находится в диапазоне
      expect(subject.result).to be_between(16, 18)
      # match - проверяет, что строка соответствует регулярному выражению
      expect(subject.result.to_s).to match(/\A17\z/)
      # start_with - проверяет, что строка начинается с заданного префикса
      expect(subject.result.to_s).to start_with('17')
      # end_with - проверяет, что строка заканчивается заданным суффиксом
      expect(subject.result.to_s).to end_with('17')
      # include - проверяет, что массив или строка содержит элемент
      expect([17]).to include(subject.result)
      # contain_exactly - проверяет, что массив содержит ровно указанные элементы
      expect([17]).to contain_exactly(subject.result)
      # have_attributes - проверяет, что объект имеет указанные атрибуты
      expect(subject).to have_attributes(result: 17)
      # respond_to - проверяет, что объект отвечает на указанный метод
      expect(subject).to respond_to(:result)
      # raise_error - проверяет, что вызов метода вызывает исключение
      expect { raise StandardError }.to raise_error(StandardError)
      # change - проверяет, что вызов метода изменяет состояние объекта
      expect { subject.add(0, 0) }.to change { subject.result }.from(17).to(17)
      # satisfy - проверяет, что значение удовлетворяет произвольному условию
      expect(subject.result).to satisfy { |value| value == 17 }
    end
  end
end