Chris@18: assertSame($expected, JsonApiSpec::isValidMemberName($member_name)); Chris@18: } Chris@18: Chris@18: /** Chris@18: * Data provider for testIsValidMemberName. Chris@18: */ Chris@18: public function providerTestIsValidMemberName() { Chris@18: // Copied from http://jsonapi.org/format/upcoming/#document-member-names. Chris@18: $data = []; Chris@18: $data['alphanumeric-lowercase'] = ['12kittens', TRUE]; Chris@18: $data['alphanumeric-uppercase'] = ['12KITTENS', TRUE]; Chris@18: $data['alphanumeric-mixed'] = ['12KiTtEnS', TRUE]; Chris@18: $data['unicode-above-u+0080'] = ['12🐱🐱', TRUE]; Chris@18: $data['hyphen-start'] = ['-kittens', FALSE]; Chris@18: $data['hyphen-middle'] = ['kitt-ens', TRUE]; Chris@18: $data['hyphen-end'] = ['kittens-', FALSE]; Chris@18: $data['lowline-start'] = ['_kittens', FALSE]; Chris@18: $data['lowline-middle'] = ['kitt_ens', TRUE]; Chris@18: $data['lowline-end'] = ['kittens_', FALSE]; Chris@18: $data['space-start'] = [' kittens', FALSE]; Chris@18: $data['space-middle'] = ['kitt ens', TRUE]; Chris@18: $data['space-end'] = ['kittens ', FALSE]; Chris@18: Chris@18: // Additional test cases. Chris@18: // @todo When D8 requires PHP >= 7, convert to \u{10FFFF}. Chris@18: $data['unicode-above-u+0080-highest-allowed'] = ["12􏿿", TRUE]; Chris@18: $data['single-character'] = ['a', TRUE]; Chris@18: Chris@18: $unsafe_chars = [ Chris@18: '+', Chris@18: ',', Chris@18: '.', Chris@18: '[', Chris@18: ']', Chris@18: '!', Chris@18: '"', Chris@18: '#', Chris@18: '$', Chris@18: '%', Chris@18: '&', Chris@18: '\'', Chris@18: '(', Chris@18: ')', Chris@18: '*', Chris@18: '/', Chris@18: ':', Chris@18: ';', Chris@18: '<', Chris@18: '=', Chris@18: '>', Chris@18: '?', Chris@18: '@', Chris@18: '\\', Chris@18: '^', Chris@18: '`', Chris@18: '{', Chris@18: '|', Chris@18: '}', Chris@18: '~', Chris@18: ]; Chris@18: foreach ($unsafe_chars as $unsafe_char) { Chris@18: $data['unsafe-' . $unsafe_char] = ['kitt' . $unsafe_char . 'ens', FALSE]; Chris@18: } Chris@18: Chris@18: // The ASCII control characters are in the range 0x00 to 0x1F plus 0x7F. Chris@18: for ($ascii = 0; $ascii <= 0x1F; $ascii++) { Chris@18: $data['unsafe-ascii-control-' . $ascii] = ['kitt' . chr($ascii) . 'ens', FALSE]; Chris@18: } Chris@18: $data['unsafe-ascii-control-' . 0x7F] = ['kitt' . chr(0x7F) . 'ens', FALSE]; Chris@18: Chris@18: return $data; Chris@18: } Chris@18: Chris@18: /** Chris@18: * Provides test cases. Chris@18: * Chris@18: * @dataProvider providerTestIsValidCustomQueryParameter Chris@18: * @covers ::isValidCustomQueryParameter Chris@18: * @covers ::isValidMemberName Chris@18: */ Chris@18: public function testIsValidCustomQueryParameter($custom_query_parameter, $expected) { Chris@18: $this->assertSame($expected, JsonApiSpec::isValidCustomQueryParameter($custom_query_parameter)); Chris@18: } Chris@18: Chris@18: /** Chris@18: * Data provider for testIsValidCustomQueryParameter. Chris@18: */ Chris@18: public function providerTestIsValidCustomQueryParameter() { Chris@18: $data = $this->providerTestIsValidMemberName(); Chris@18: Chris@18: // All valid member names are also valid custom query parameters, except for Chris@18: // single-character ones. Chris@18: $data['single-character'][1] = FALSE; Chris@18: Chris@18: // Custom query parameter test cases. Chris@18: $data['custom-query-parameter-lowercase'] = ['foobar', FALSE]; Chris@18: $data['custom-query-parameter-dash'] = ['foo-bar', TRUE]; Chris@18: $data['custom-query-parameter-underscore'] = ['foo_bar', TRUE]; Chris@18: $data['custom-query-parameter-camelcase'] = ['fooBar', TRUE]; Chris@18: Chris@18: return $data; Chris@18: } Chris@18: Chris@18: }