Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
90.20% covered (success)
90.20%
46 / 51
85.71% covered (warning)
85.71%
6 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 1
ZMonoLingualStringSet
90.20% covered (success)
90.20%
46 / 51
85.71% covered (warning)
85.71%
6 / 7
17.27
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 getDefinition
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
1 / 1
1
 isValid
64.29% covered (warning)
64.29%
9 / 14
0.00% covered (danger)
0.00%
0 / 1
14.56
 getSerialized
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
1
 getZValue
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getLanguage
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getStringSet
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2/**
3 * WikiLambda ZMonoLingualStringSet
4 *
5 * @file
6 * @ingroup Extensions
7 * @copyright 2020– Abstract Wikipedia team; see AUTHORS.txt
8 * @license MIT
9 */
10
11namespace MediaWiki\Extension\WikiLambda\ZObjects;
12
13use MediaWiki\Extension\WikiLambda\Registry\ZLangRegistry;
14use MediaWiki\Extension\WikiLambda\Registry\ZTypeRegistry;
15use MediaWiki\Extension\WikiLambda\ZObjectUtils;
16
17class ZMonoLingualStringSet extends ZObject {
18
19    /**
20     * Create a ZMonoLingualStringSet instance given a language ZReference and an array
21     * or ZTypedList of ZString instances. Internally this class bypasses ZTypedList
22     * and stores an array.
23     *
24     * @param ZReference|ZNaturalLanguage $language
25     * @param ZTypedList|array $value
26     */
27    public function __construct( $language, $value = [] ) {
28        $this->data[ ZTypeRegistry::Z_MONOLINGUALSTRINGSET_LANGUAGE ] = $language;
29        $this->data[ ZTypeRegistry::Z_MONOLINGUALSTRINGSET_VALUE ] = [];
30        foreach ( ZObjectUtils::getIterativeList( $value ) as $index => $element ) {
31            $this->data[ ZTypeRegistry::Z_MONOLINGUALSTRINGSET_VALUE ][] = $element;
32        }
33    }
34
35    /**
36     * @inheritDoc
37     */
38    public static function getDefinition(): array {
39        return [
40            'type' => [
41                'type' => ZTypeRegistry::Z_REFERENCE,
42                'value' => ZTypeRegistry::Z_MONOLINGUALSTRINGSET,
43            ],
44            'keys' => [
45                ZTypeRegistry::Z_MONOLINGUALSTRINGSET_LANGUAGE => [
46                    'type' => ZTypeRegistry::HACK_REFERENCE_LANGUAGE,
47                    'required' => true,
48                ],
49                ZTypeRegistry::Z_MONOLINGUALSTRINGSET_VALUE => [
50                    'type' => ZTypeRegistry::HACK_ARRAY_Z_STRING,
51                    'required' => true,
52                ],
53            ],
54        ];
55    }
56
57    /**
58     * @inheritDoc
59     */
60    public function isValid(): bool {
61        // Language can be a Reference or a literal Natural Language
62        $lang = $this->data[ ZTypeRegistry::Z_MONOLINGUALSTRINGSET_LANGUAGE ];
63        if ( !( $lang instanceof ZReference ) && !( $lang instanceof ZNaturalLanguage ) ) {
64            return false;
65        }
66
67        // If ZReference, check it's a valid language Zid
68        $langs = ZLangRegistry::singleton();
69        if ( ( $lang instanceof ZReference ) && !$langs->isValidLanguageZid( $lang->getZValue() ) ) {
70            return false;
71        }
72
73        // If ZNaturalLanguage, check it's a valid Z60 object
74        if ( ( $lang instanceof ZNaturalLanguage ) && !$lang->isValid() ) {
75            return false;
76        }
77
78        if ( !is_array( $this->data[ ZTypeRegistry::Z_MONOLINGUALSTRINGSET_VALUE ] ) ) {
79            return false;
80        }
81
82        foreach ( $this->data[ ZTypeRegistry::Z_MONOLINGUALSTRINGSET_VALUE ] as $value ) {
83            if ( !( $value instanceof ZString ) ) {
84                return false;
85            }
86        }
87
88        return true;
89    }
90
91    /**
92     * @inheritDoc
93     */
94    public function getSerialized( $form = self::FORM_CANONICAL ) {
95        $listType = new ZReference( ZTypeRegistry::Z_STRING );
96        $language = $this->data[ ZTypeRegistry::Z_MONOLINGUALSTRINGSET_LANGUAGE ];
97        $typedList = new ZTypedList(
98            ZTypedList::buildType( $listType ),
99            $this->data[ ZTypeRegistry::Z_MONOLINGUALSTRINGSET_VALUE ]
100        );
101        return (object)[
102            ZTypeRegistry::Z_OBJECT_TYPE => $this->getZTypeObject()->getSerialized( $form ),
103            ZTypeRegistry::Z_MONOLINGUALSTRINGSET_LANGUAGE => $language->getSerialized( $form ),
104            ZTypeRegistry::Z_MONOLINGUALSTRINGSET_VALUE => $typedList->getSerialized( $form )
105        ];
106    }
107
108    /**
109     * Get a map representing this ZMonoLingualString language and string set.
110     *
111     * @return array Language and string set of this ZMonoLingualString
112     */
113    public function getZValue() {
114        return [ $this->getLanguage() => $this->getStringSet() ];
115    }
116
117    /**
118     * Get the Zid that represents the language for this ZMonoLingualStringSet
119     *
120     * @return string Language Zid or code
121     */
122    public function getLanguage() {
123        return $this->data[ ZTypeRegistry::Z_MONOLINGUALSTRINGSET_LANGUAGE ]->getZValue();
124    }
125
126    /**
127     * Get an array of strings values contained by this ZMonoLingualStringSet
128     *
129     * @return string[] Set of string values
130     */
131    public function getStringSet() {
132        return array_map( static function ( $zstring ) {
133            return $zstring->getZValue();
134        }, $this->data[ ZTypeRegistry::Z_MONOLINGUALSTRINGSET_VALUE ]
135        );
136    }
137}