From 16b81a879f666fab445c82bae50879316eef3ad2 Mon Sep 17 00:00:00 2001 From: Artem Darius Weber Date: Thu, 23 Jan 2025 08:11:17 +0300 Subject: [PATCH] feat: enhance DataListStudentShort with data preparation methods and add unit tests --- lab2/data_list_student_short.rb | 55 +++++++++++++++++----- lab2/tests/test_data_list_student_short.rb | 54 +++++++++++++++++++++ 2 files changed, 98 insertions(+), 11 deletions(-) create mode 100644 lab2/tests/test_data_list_student_short.rb diff --git a/lab2/data_list_student_short.rb b/lab2/data_list_student_short.rb index 4e39671..45134df 100644 --- a/lab2/data_list_student_short.rb +++ b/lab2/data_list_student_short.rb @@ -1,21 +1,54 @@ -require_relative 'data_table' +require_relative './data_table' class DataListStudentShort < DataList + def initialize(items) + super(items.select { |item| item.is_a?(StudentShort) }) + end + def get_names - ['№', 'Фамилия и инициалы', 'Телефон', 'Telegram', 'Email'] + column_names end def get_data - data = @items.each_with_index.map do |student, index| - [ - index + 1, # id - student.surname_initials, # Фамилия и инициалы - student.phone || '-', # Телефон (или прочерк) - student.telegram || '-', # Telegram (или прочерк) - student.email || '-' # Email (или прочерк) - ] + data = prepare_table_data + DataTable.new(data) + end + + private + + def column_names + ['№', 'Фамилия и инициалы', 'Телефон', 'Telegram', 'Email'] + end + + def prepare_table_data + @items.each_with_index.map do |item, index| + prepare_row(item, index) end + end - DataTable.new(data) + def prepare_row(item, index) + [ + index + 1, # id + item.surname_initials, # Фамилия и инициалы + item.phone || '-', # Телефон (или прочерк) + item.telegram || '-', # Telegram (или прочерк) + item.email || '-' # Email (или прочерк) + ] + end + + def extract_surname_initials(item) + item.respond_to?(:surname_initials) ? item.surname_initials : 'N/A' + end + + def extract_phone(item) + item.respond_to?(:phone) ? item.phone : nil + end + + def extract_telegram(item) + item.respond_to?(:telegram) ? item.telegram : nil + end + + def extract_email(item) + item.respond_to?(:email) ? item.email : nil end end \ No newline at end of file diff --git a/lab2/tests/test_data_list_student_short.rb b/lab2/tests/test_data_list_student_short.rb new file mode 100644 index 0000000..77f2695 --- /dev/null +++ b/lab2/tests/test_data_list_student_short.rb @@ -0,0 +1,54 @@ +require 'minitest/autorun' +require_relative '../data_list_student_short' +require_relative '../student_short' + +class TestDataListStudentShort < Minitest::Test + def setup + @students = [ + StudentShort.new(id: '1', surname_initials: 'Иванов И.И.', phone: '+79991112233'), + StudentShort.new(id: '2', surname_initials: 'Петров П.П.', telegram: '@petrov'), + StudentShort.new(id: '3', surname_initials: 'Сидоров С.С.', email: 'sidorov@mail.ru') + ] + @data_list = DataListStudentShort.new(@students) + end + + def test_get_names + assert_equal ['№', 'Фамилия и инициалы', 'Телефон', 'Telegram', 'Email'], + @data_list.get_names + end + + def test_get_data + table = @data_list.get_data + + assert_equal 3, table.rows_count + assert_equal 5, table.columns_count + + assert_equal 1, table.item(0, 0) + assert_equal 'Иванов И.И.', table.item(0, 1) + assert_equal '+79991112233', table.item(0, 2) + assert_equal '-', table.item(0, 3) + assert_equal '-', table.item(0, 4) + + assert_equal '-', table.item(1, 2) + assert_equal '@petrov', table.item(1, 3) + end + + def test_selection_functionality + @data_list.select(0) + @data_list.select(2) + assert_equal [0, 2], @data_list.get_selected + end + + def test_invalid_data_handling + invalid_students = [ + { id: '1', name: 'Иванов И.И.', phone: '+79991112233' }, + StudentShort.new(id: '2', surname_initials: 'Петров П.П.', telegram: '@petrov') + ] + data_list = DataListStudentShort.new(invalid_students) + + table = data_list.get_data + + assert_equal 'N/A', table.item(0, 1) + assert_equal '-', table.item(0, 3) + end +end \ No newline at end of file