2023-12-14 11:56:42 -05:00
< ? php
/**
2024-05-30 14:13:41 -04:00
* SPDX - FileCopyrightText : 2023 Nextcloud GmbH and Nextcloud contributors
* SPDX - License - Identifier : AGPL - 3.0 - or - later
2023-12-14 11:56:42 -05:00
*/
namespace OCA\Theming\Tests\Themes ;
use OCA\Theming\ITheme ;
use OCA\Theming\Util ;
use Test\TestCase ;
class AccessibleThemeTestCase extends TestCase {
protected ITheme $theme ;
protected Util $util ;
2023-12-16 08:04:53 -05:00
/**
* Set to true to check for WCAG AAA level accessibility
*/
protected bool $WCAGaaa = false ;
2023-12-14 11:56:42 -05:00
public function dataAccessibilityPairs () {
2023-12-16 08:04:53 -05:00
$textContrast = $this -> WCAGaaa ? 7.0 : 4.5 ;
$elementContrast = 3.0 ;
2023-12-14 11:56:42 -05:00
return [
'primary-element on background' => [
[
'--color-primary-element' ,
'--color-primary-element-hover' ,
],
[
'--color-main-background' ,
'--color-background-hover' ,
'--color-background-dark' ,
'--color-background-darker' ,
'--color-main-background-blur' ,
],
2023-12-16 08:04:53 -05:00
$elementContrast ,
2023-12-14 11:56:42 -05:00
],
2023-12-14 11:57:45 -05:00
'status color elements on background' => [
[
'--color-error' ,
'--color-error-hover' ,
'--color-warning' ,
'--color-warning-hover' ,
'--color-info' ,
'--color-info-hover' ,
'--color-success' ,
'--color-success-hover' ,
2024-03-06 08:37:59 -05:00
'--color-favorite' ,
2023-12-14 11:57:45 -05:00
],
[
'--color-main-background' ,
'--color-background-hover' ,
'--color-background-dark' ,
'--color-background-darker' ,
'--color-main-background-blur' ,
],
2023-12-16 08:04:53 -05:00
$elementContrast ,
],
2024-01-17 09:26:56 -05:00
'border-colors' => [
[
'--color-border-maxcontrast' ,
],
[
'--color-main-background' ,
'--color-background-hover' ,
'--color-background-dark' ,
'--color-main-background-blur' ,
],
$elementContrast ,
],
2023-12-16 08:04:53 -05:00
// Those two colors are used for borders which will be `color-main-text` on focussed state, thus need 3:1 contrast to it
'success-error-border-colors' => [
[
'--color-error' ,
'--color-success' ,
],
[
'--color-main-text' ,
],
$elementContrast ,
2023-12-14 11:57:45 -05:00
],
2023-12-14 11:56:42 -05:00
'primary-element-text' => [
2023-12-15 10:14:37 -05:00
[
'--color-primary-element-text' ,
'--color-primary-element-text-dark' ,
],
2023-12-14 11:56:42 -05:00
[
'--color-primary-element' ,
'--color-primary-element-hover' ,
],
2023-12-16 08:04:53 -05:00
$textContrast ,
2023-12-14 11:56:42 -05:00
],
'primary-element-light-text' => [
[ '--color-primary-element-light-text' ],
[
'--color-primary-element-light' ,
'--color-primary-element-light-hover' ,
],
2023-12-16 08:04:53 -05:00
$textContrast ,
2023-12-14 11:56:42 -05:00
],
'main-text' => [
[ '--color-main-text' ],
[
'--color-main-background' ,
'--color-background-hover' ,
'--color-background-dark' ,
'--color-background-darker' ,
'--color-main-background-blur' ,
],
2023-12-16 08:04:53 -05:00
$textContrast ,
2023-12-14 11:56:42 -05:00
],
'max-contrast-text' => [
[ '--color-text-maxcontrast' ],
[
'--color-main-background' ,
'--color-background-hover' ,
'--color-background-dark' ,
],
2023-12-16 08:04:53 -05:00
$textContrast ,
2023-12-14 11:56:42 -05:00
],
'max-contrast text-on blur' => [
[ '--color-text-maxcontrast-background-blur' ],
[
'--color-main-background-blur' ,
],
2023-12-16 08:04:53 -05:00
$textContrast ,
2023-12-14 11:56:42 -05:00
],
2023-12-14 11:57:45 -05:00
'status-text' => [
[
'--color-error-text' ,
'--color-warning-text' ,
'--color-success-text' ,
'--color-info-text' ,
],
[
'--color-main-background' ,
'--color-background-hover' ,
'--color-background-dark' ,
'--color-main-background-blur' ,
],
2023-12-16 08:04:53 -05:00
$textContrast ,
2023-12-14 11:57:45 -05:00
],
2023-12-14 11:56:42 -05:00
];
}
/**
* @ dataProvider dataAccessibilityPairs
*/
public function testAccessibilityOfVariables ( $mainColors , $backgroundColors , $minContrast ) : void {
2023-12-15 10:14:37 -05:00
if ( ! isset ( $this -> theme )) {
$this -> markTestSkipped ( 'You need to setup $this->theme in your setUp function' );
} elseif ( ! isset ( $this -> util )) {
$this -> markTestSkipped ( 'You need to setup $this->util in your setUp function' );
}
2023-12-14 11:56:42 -05:00
$variables = $this -> theme -> getCSSVariables ();
// Blur effect does not work so we mockup the color - worst supported case is the default "clouds" background image (on dark themes the clouds with white color are bad on bright themes the primary color as sky is bad)
2023-12-14 11:57:45 -05:00
$variables [ '--color-main-background-blur' ] = $this -> util -> mix ( $variables [ '--color-main-background' ], $this -> util -> isBrightColor ( $variables [ '--color-main-background' ]) ? '#000000' : '#ffffff' , 75 );
2023-12-14 11:56:42 -05:00
foreach ( $backgroundColors as $background ) {
$this -> assertStringStartsWith ( '#' , $variables [ $background ], 'Is not a plain color variable - consider to remove or fix this test' );
foreach ( $mainColors as $main ) {
$this -> assertStringStartsWith ( '#' , $variables [ $main ], 'Is not a plain color variable - consider to remove or fix this test' );
$realContrast = $this -> util -> colorContrast ( $variables [ $main ], $variables [ $background ]);
$this -> assertGreaterThanOrEqual ( $minContrast , $realContrast , " Contrast is not high enough for $main ( " . $variables [ $main ] . " ) on $background ( " . $variables [ $background ] . ')' );
}
}
}
}