Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: master
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 182 lines (159 sloc) 3.931 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
use v6;

use Test;

=begin pod

Basic tests for the ord() and chr() built-in.

=end pod

# L<S29/Conversions/ord>
# L<S29/Conversions/ords>
# L<S29/Conversions/chr>
# L<S29/Conversions/chrs>

# What is the best way to test 0 through 31??
my @maps = (
  " ", 32,
  "!", 33,
  '"', 34,
  "#", 35,
  '$', 36,
  "%", 37,
  "&", 38,
  "'", 39,
  "(", 40,
  ")", 41,
  "*", 42,
  "+", 43,
  ",", 44,
  "-", 45,
  ".", 46,
  "/", 47,
  "0", 48,
  "1", 49,
  "2", 50,
  "3", 51,
  "4", 52,
  "5", 53,
  "6", 54,
  "7", 55,
  "8", 56,
  "9", 57,
  ":", 58,
  ";", 59,
  "<", 60,
  "=", 61,
  ">", 62,
  "?", 63,
  "@", 64,
  "A", 65,
  "B", 66,
  "C", 67,
  "D", 68,
  "E", 69,
  "F", 70,
  "G", 71,
  "H", 72,
  "I", 73,
  "J", 74,
  "K", 75,
  "L", 76,
  "M", 77,
  "N", 78,
  "O", 79,
  "P", 80,
  "Q", 81,
  "R", 82,
  "S", 83,
  "T", 84,
  "U", 85,
  "V", 86,
  "W", 87,
  "X", 88,
  "Y", 89,
  "Z", 90,
  "[", 91,
  "\\", 92,
  "]", 93,
  "^", 94,
  "_", 95,
  "`", 96,
  "a", 97,
  "b", 98,
  "c", 99,
  "d", 100,
  "e", 101,
  "f", 102,
  "g", 103,
  "h", 104,
  "i", 105,
  "j", 106,
  "k", 107,
  "l", 108,
  "m", 109,
  "n", 110,
  "o", 111,
  "p", 112,
  "q", 113,
  "r", 114,
  "s", 115,
  "t", 116,
  "u", 117,
  "v", 118,
  "w", 119,
  "x", 120,
  "y", 121,
  "z", 122,
  '{', 123,
  "|", 124,
  '}', 125,
  "~", 126,

  # Unicode tests
  "ä", 228,
  "€", 8364,
  "»", 187,
  "«", 171,

  # Special chars
  "\o00", 0,
  "\o01", 1,
  "\o03", 3,
);

plan 53 + @maps;

for @maps -> $char, $code {
  my $descr = "\\{$code}{$code >= 32 ?? " == '{$char}'" !! ""}";
  is ord($char), $code, "ord() works for $descr";
  is chr($code), $char, "chr() works for $descr";
}

for 0...31 -> $code {
  my $char = chr($code);
  is ord($char), $code, "ord(chr($code)) is $code";
}

is ords('ABCDEFGHIJK'), '65 66 67 68 69 70 71 72 73 74 75', "ords() works as expected";
is chrs(65..75), 'ABCDEFGHIJK', "chrs() method works as expected";
is chrs(ords('ABCDEFGHIJK')), 'ABCDEFGHIJK', "chrs(ords()) round-trips correctly";
is ords(chrs(65..75)), '65 66 67 68 69 70 71 72 73 74 75', "ords(chrs()) round-trips correctly";

is 'A'.ord, 65, "there's a .ord method";
is 65.chr, 'A', "there's a .chr method";

is ('ABCDEFGHIJK').ords, '65 66 67 68 69 70 71 72 73 74 75', "there's a .ords method";
is (65..75).chrs, 'ABCDEFGHIJK', "there's a .chrs method";
is ('ABCDEFGHIJK').ords.chrs, 'ABCDEFGHIJK', "ords > chrs round-trips correctly";
is (65..75).chrs.ords, '65 66 67 68 69 70 71 72 73 74 75', "chrs > ords round-trips correctly";

#?niecza skip "multi-arg variants of chr not in place yet"
is chrs(104, 101, 108, 108, 111), 'hello', 'chrs works with a list of ints';

#?niecza 5 skip "chr handling of invalid code-points"
#?rakudo.moar todo 'chr surrogate'
#?rakudo.jvm todo 'chr surrogate'
dies_ok {chr(0xD800)}, "chr of surrogate";
#?rakudo.parrot 2 todo 'chr of noncharacter'
lives_ok {chr(0x2FFFE)}, "chr of noncharacter";
lives_ok {chr(0x2FFFF)}, "chr of noncharacter";
#?rakudo.moar todo 'chr max'
dies_ok {chr(0x10FFFF+1)}, "chr out of range (max)";
dies_ok {chr(-1)}, "chr out of range (negative)";

ok !defined(ord("")), 'ord("") returns an undefined value';

#?rakudo.jvm skip 'high character name lookup'
is "\c[DROMEDARY CAMEL]".ord, 0x1F42A, "ord of named high character";
is chr(0x1F42A).ord, 0x1F42A, "chr > ord round trip of high character";

{
    is "\c[LATIN CAPITAL LETTER A WITH DOT ABOVE]".ord, 550, '.ord defaults to graphemes (2)';

    #?rakudo todo 'RT #65172 - combining graphemes'
    #?niecza todo
    is "\c[LATIN CAPITAL LETTER A, COMBINING DOT ABOVE]".ord, 550, '.ord defaults to graphemes (1)';

}

#vim: ft=perl6
Something went wrong with that request. Please try again.