The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Kafka::TestInternals;

=head1 NAME

Kafka::TestInternals - Constants and functions used in the tests.

=head1 VERSION

This documentation refers to C<Kafka::TestInternals> version 0.9001 .

=cut

#-- Pragmas --------------------------------------------------------------------

use 5.010;
use strict;
use warnings;

# ENVIRONMENT ------------------------------------------------------------------

our $VERSION = '0.9001';

use Exporter qw(
    import
);

our @EXPORT_OK = qw(
    _is_suitable_int
    @not_array
    @not_array0
    @not_empty_string
    @not_hash
    @not_is_like_server_list
    @not_isint
    @not_nonnegint
    @not_number
    @not_posint
    @not_posnumber
    @not_right_object
    @not_string
    @not_string_array
    @not_topics_array
    $topic
);

#-- load the modules -----------------------------------------------------------

use Const::Fast;
use Scalar::Util::Numeric qw(
    isbig
    isint
);

use Kafka::Cluster qw(
    $DEFAULT_TOPIC
);
use Kafka::Internals qw(
    $APIKEY_FETCH
    $APIKEY_PRODUCE
    $APIKEY_OFFSET
);

#-- declarations ---------------------------------------------------------------

=head1 DESCRIPTION

This module is not a user module.

In order to achieve better performance,
functions of this module do not perform arguments validation.

=head2 EXPORT

The following constants are available for export

=cut

# options for testing arguments:
#    "\x{20ac}",
#    undef,
#    0,
#    0.5,
#    1,
#    -1,
#    -3,
#    q{},
#    '0',
#    '0.5',
#    '1',
#    9999999999999999,
#    \1,
#    [],
#    {},
#    [ 'something' ],
#    { foo => 'bar' },
#    bless( {}, 'FakeName' ),
#   'simple string',

=head3 C<$topic>

Name topic used in the tests.

=cut
const our $topic    => $DEFAULT_TOPIC;

=head3 C<@not_right_object>

The values do not correspond to the object type you want.

=cut
const our @not_right_object => (
    "\x{20ac}",
    undef,
    0,
    0.5,
    1,
    -1,
    -3,
    q{},
    '0',
    '0.5',
    '1',
    9999999999999999,
    \1,
    [],
    {},
    [ 'something' ],
    { foo => 'bar' },
    bless( {}, 'FakeName' ),
   'simple string',
);

=head3 C<@not_nonnegint>

The values do not correspond to not negative integers.

=cut
const our @not_nonnegint => (
    "\x{20ac}",
    undef,
    0.5,
    -1,
    -3,
    q{},
    '0.5',
    \'scalar',
    [],
    {},
    [ 'something' ],
    { foo => 'bar' },
    bless( {}, 'FakeName' ),
);

=head3 C<@not_empty_string>

The values do not correspond to a non-empty string.

=cut
const our @not_empty_string => (
    "\x{20ac}",
    \1,
    [],
    {},
    [ 'something' ],
    { foo => 'bar' },
    \'string',
    bless( {}, 'FakeName' ),
);

=head3 C<@not_string>

The values do not correspond to any string.

=cut
const our @not_string => (
    @not_empty_string,
    undef,
    q{},
);

=head3 C<@not_posint>

The values do not correspond to a positive integers.

=cut
const our @not_posint => (
    "\x{20ac}",
    undef,
    0,
    0.5,
    -1,
    -3,
    q{},
    '0',
    '0.5',
    \'scalar',
    [],
    {},
    [ 'something' ],
    { foo => 'bar' },
    bless( {}, 'FakeName' ),
);

=head3 C<@not_number>

The values do not correspond to any number.

=cut
const our @not_number => (
    "\x{20ac}",
    undef,
    q{},
    \'scalar',
    [],
    {},
    [ 'something' ],
    { foo => 'bar' },
    bless( {}, 'FakeName' ),
    'incorrect number,'
);

=head3 C<@not_posnumber>

The values do not correspond to a positive number.

=cut
const our @not_posnumber => (
    @not_number,
    0,
    -1,
);

=head3 C<@not_isint>

The values do not correspond to any integers.

=cut
const our @not_isint => (
    "\x{20ac}",
#    undef,
    0.5,
    q{},
    '0.5',
    \'scalar',
    [],
    {},
    [ 'something' ],
    { foo => 'bar' },
    bless( {}, 'FakeName' ),
);

=head3 C<@not_array0>

The values do not correspond to a raw and unblessed ARRAY reference.

=cut
const our @not_array0 => (
    "\x{20ac}",
    undef,
    0,
    0.5,
    1,
    -1,
    -3,
    q{},
    '0',
    '0.5',
    '1',
    9999999999999999,
    \'scalar',
    {},
    { foo => 'bar' },
    bless( {}, 'FakeName' ),
);

=head3 C<@not_array0>

The values do not correspond to a raw and unblessed ARRAY reference containing at least one element of any kind.

=cut
const our @not_array => (
    @not_array0,
    [],
);

=head3 C<@not_topics_array>

The values do not correspond to a 'topics' ARRAY reference.
For 'topics' ARRAY examples see C<t/*_decode_encode.t>.

=cut
our @not_topics_array;
foreach my $bad_value (
        @not_array0,
        [],
        'scalar',
    ) {
    push @not_topics_array,
        {
            ApiKey  => $APIKEY_PRODUCE,
            topics  => $bad_value,
        },
        {
            ApiKey  => $APIKEY_PRODUCE,
            topics  => [ $bad_value ],
        },
        {
            ApiKey  => $APIKEY_PRODUCE,
            topics  => [
                {
                    TopicName   => $topic,
                    partitions  => $bad_value,
                },
            ],
        },
        {
            ApiKey  => $APIKEY_PRODUCE,
            topics  => [
                {
                    TopicName   => $topic,
                    partitions  => [ $bad_value ],
                },
            ],
        },
    ;
}

=head3 C<@not_is_like_server_list>

The values do not correspond to a reference to an array of server names.

=cut
const our @not_is_like_server_list => (
    [ "\x{20ac}" ],
    [ undef ],
    [ 0 ],
    [ 0.5 ],
    [ 1 ],
    [ -1 ],
    [ -3 ],
    [ q{} ],
    [ '0' ],
    [ '0.5' ],
    [ '1' ],
    [ 9999999999999999 ],
    [ \'scalar' ],
    [ [] ],
    [ {} ],
    [ [ 'something' ] ],
    [ { foo => 'bar' } ],
    [ bless( {}, 'FakeName' ) ],
    [ 'string' ],
);

=head3 C<@not_string_array>

The values do not correspond to a reference to an array of any strings.

=cut
const our @not_string_array => (
    [ "\x{20ac}" ],
    [ undef ],
    [ \1 ],
    [ [] ],
    [ {} ],
    [ [ 'something' ] ],
    [ { foo => 'bar' } ],
    [ bless( {}, 'FakeName' ) ],
);

=head3 C<@not_hash>

The values do not correspond to a raw and unblessed HASH reference with at least one entry.

=cut
const our @not_hash => (
    "\x{20ac}",
    undef,
    0,
    0.5,
    1,
    -1,
    -3,
    q{},
    '0',
    '0.5',
    '1',
    9999999999999999,
#    \'scalar',
    [],
    {},
    [ 'something' ],
    bless( {}, 'FakeName' ),
   'simple string',
);

#-- public functions -----------------------------------------------------------

#-- private functions ----------------------------------------------------------

# Verifying whether the argument is a simple int or a bigint
sub _is_suitable_int {
    my ( $n ) = @_;

    $n // return;
    return isint( $n ) || isbig( $n );
}

#-- public attributes ----------------------------------------------------------

#-- public methods -------------------------------------------------------------

#-- private attributes ---------------------------------------------------------

#-- private methods ------------------------------------------------------------

1;

__END__

=head1 SEE ALSO

The basic operation of the Kafka package modules:

L<Kafka|Kafka> - constants and messages used by the Kafka package modules.

L<Kafka::Connection|Kafka::Connection> - interface to connect to a Kafka cluster.

L<Kafka::Producer|Kafka::Producer> - interface for producing client.

L<Kafka::Consumer|Kafka::Consumer> - interface for consuming client.

L<Kafka::Message|Kafka::Message> - interface to access Kafka message
properties.

L<Kafka::Int64|Kafka::Int64> - functions to work with 64 bit elements of the
protocol on 32 bit systems.

L<Kafka::Protocol|Kafka::Protocol> - functions to process messages in the
Apache Kafka's Protocol.

L<Kafka::IO|Kafka::IO> - low-level interface for communication with Kafka server.

L<Kafka::Exceptions|Kafka::Exceptions> - module designated to handle Kafka exceptions.

L<Kafka::Internals|Kafka::Internals> - internal constants and functions used
by several package modules.

A wealth of detail about the Apache Kafka and the Kafka Protocol:

Main page at L<http://kafka.apache.org/>

Kafka Protocol at L<https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol>

=head1 SOURCE CODE

Kafka package is hosted on GitHub:
L<https://github.com/TrackingSoft/Kafka>

=head1 AUTHOR

Sergey Gladkov, E<lt>sgladkov@trackingsoft.comE<gt>

=head1 CONTRIBUTORS

Alexander Solovey

Jeremy Jordan

Sergiy Zuban

Vlad Marchenko

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2012-2016 by TrackingSoft LLC.

This package is free software; you can redistribute it and/or modify it under
the same terms as Perl itself. See I<perlartistic> at
L<http://dev.perl.org/licenses/artistic.html>.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

=cut