"""module contains unittests for pca""" import unittest from unittest.mock import patch from unittest.mock import Mock import numpy as np import pytest from gn3.computations.pca import cache_pca_dataset from gn3.computations.pca import generate_pca_temp_traits from gn3.computations.pca import generate_scree_plot_data from gn3.computations.pca import process_factor_loadings_tdata class TestPCA(unittest.TestCase): """pca testcase class""" @pytest.mark.unit_test def test_process_factor_loadings(self): """test for processing factor loadings""" test_array = np.array([ [-0.23511749, -0.61483617, -0.26872797, 0.70319381], [-0.71057342, 0.4623377, -0.52921008, -0.0355803], [-0.60977093, -0.02877103, 0.78874096, 0.07238328], [0.26073856, 0.63827311, 0.16003023, 0.70640864] ]) expected_results = [[-0.23511749, -0.71057342, -0.60977093], [-0.61483617, 0.4623377, -0.02877103], [-0.26872797, -0.52921008, 0.78874096], [0.70319381, -0.0355803, 0.07238328]] self.assertEqual(process_factor_loadings_tdata( test_array, 3), expected_results) @pytest.mark.unit_test @patch("gn3.computations.pca.generate_pca_traits_vals") def test_generate_pca_datasets(self, mock_pca_data): """test for generating temp pca dataset""" mock_pca_data.return_value = np.array([[21, 10, 17, 15, 13], [21, 11, 18, 9, 1], [22, 16, 0, 0.22667229, -1], [31, 12, 10, 17, 11]]) shared_samples = ["BXD1", "BXD2", "BXD", "BXD4", "Unkown"] dataset_samples = ["BXD1", "BXD5", "BXD4", "BXD"] expected_results = { "PCA1_mouse_G1_now": ["21.0", "x", "10.0", "17.0"], "PCA2_mouse_G1_now": ["21.0", "x", "11.0", "18.0"], "PCA3_mouse_G1_now": ["22.0", "x", "16.0", "0.0"], "PCA4_mouse_G1_now": ["31.0", "x", "12.0", "10.0"] } results = generate_pca_temp_traits(species="mouse", group="G1", traits_data=[], dataset_samples=dataset_samples, corr_array=[], shared_samples=shared_samples, create_time="now") self.assertEqual(results, expected_results) @pytest.mark.unit_test def test_generate_scree_plot(self): """test scree plot data is generated""" variance = [0.9271, 0.06232, 0.031] self.assertEqual(generate_scree_plot_data(variance), (['PC1', 'PC2', 'PC3'], [92.7, 6.2, 3.1])) @pytest.mark.unit_test def test_cache_pca_datasets(self): """test for caching pca datasets""" pca_traits = { "PCA_1": ["11.0", "x", "9.0", "7.0"], "PCA_2": ["x", "x", "1.2", "3.1"] } self.assertEqual(cache_pca_dataset(redis_conn={}, exp_days=30, pca_trait_dict=pca_traits), False) mock_redis = Mock() mock_redis.set.return_value = True test_data = [({}, 30, pca_traits, False), (mock_redis, 30, pca_traits, True)] for (test_redis, exp_day, test_traits, expected) in test_data: with self.subTest(redis_conn=test_redis, exp_days=exp_day, pca_trait_dict=test_traits): self.assertEqual(cache_pca_dataset( test_redis, exp_day, test_traits), expected)