Regex не работает для значений диапазона в модульном тестировании PHP Laravel - PullRequest
0 голосов
/ 09 сентября 2018

Я пытался сделать регулярное выражение с условием ниже:

-90 < latitude < 90

-180 < longitude < 180

Should have 6 decimal points.

и мое регулярное выражение для обоих:

Latitude : /^-?(0|[0-9]|[1-8][0-9]|90)\.{1}\d{6}$/

Longitude : /^-?(0|[0-9]|[1-9][0-9]|1[0-7][0-9]|180)\.{1}\d{6}$/

Максимальный тест пройден через это. Но когда я пытаюсь это сделать в Php Unit

Latitude : 10.000000 , Longitude: 10.000000 // Got Failed

Latitude : 0.000001 , Longitude: 0.000001 // Got Failed

Latitude : 0.000000 , Longitude: 0.000000 // Got Failed

Я хочу также включить эти 3 варианта. Я использую это регулярное выражение в larval 5.6 (PHP).

Также, когда мне это нравится, он начинает работать в модульном тесте.

Latitude : "10.000000" , Longitude: "10.000000" // Got Succeed

Latitude : "0.000001" , Longitude: "0.000001" // Got Succeed

Latitude : "0.000000" , Longitude: "0.000000" // Got Succeed

Если я пробую через Почтальон, это работает в обоих случаях. Но во время модульного тестирования Laravel PHP он не работает.

Мои правила проверки:

public static $fieldValidations = [
        'serial'    => 'required|unique:panels|size:16|alpha_num',
        'latitude'  => array('required','numeric','between:-90,90','regex:/^-?(0|[0-9]|[1-8][0-9]|90)\.{1}\d{6}$/'),
        'longitude'  => array('required','numeric','between:-180,180','regex:/^-?(0|[0-9]|[1-9][0-9]|1[0-7][0-9]|180)\.{1}\d{6}$/'),
    ];

Мой код модульного тестирования Php:

public function testStoreFailureLatitudeLongitudeAllZeroDecimalCase()
    {
        $response = $this->json('POST', '/api/panels', [
            'serial'    => 'AAAABBBBCCCC1234',
            'longitude' => 10.000000,
            'latitude'  => -20.000000
        ]);

        $response->assertStatus(201);
    }

    public function testStoreFailurePrecisionFloatDecimalValueCase()
    {
        $response = $this->json('POST', '/api/panels', [
            'serial'    => 'AAAABBBBCCCC1234',
            'longitude' => 0.000001,
            'latitude'  => 0.000001
        ]);

        $response->assertStatus(201);
    }

    public function testStoreFailurePrecisionFloatDecimalValuewithZeroCase()
    {
        $response = $this->json('POST', '/api/panels', [
            'serial'    => 'AAAABBBBCCCC1234',
            'longitude' => 0.000000,
            'latitude'  => 0.000000
        ]);

        $response->assertStatus(201);
    }

Это 3 случая, когда он потерпел неудачу и с такими же значениями через почтальон работает.

Любая помощь?

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Возможно, для Локатора вы можете использовать:

^-?(?:[1-8][0-9]|[0-9]|90)\.\d{6}$

А для Долготы вы можете использовать:

^-?(?:1[0-7][0-9]|[1-9][0-9]|[0-9]|180)\.\d{6}$

Обратите внимание, что вы можете опустить {1}, для 0|[0-9] вы можете использовать просто [0-9], и, если вы не имеете в виду захваченную группу, вы можете использовать не чередующуюся группу (?: для чередования.

0 голосов
/ 09 сентября 2018
function validateLatitude($lat) {
  return preg_match('/^(\+|-)?(?:90(?:(?:\.0{1,6})?)|(?:[0-9]|[1-8][0-9])(?:(?:\.[0-9]{1,6})?))$/', $lat);
}

function validateLongitude($long) {
  return preg_match('/^(\+|-)?(?:180(?:(?:\.0{1,6})?)|(?:[0-9]|[1-9][0-9]|1[0-7][0-9])(?:(?:\.[0-9]{1,6})?))$/', $long);
}

не работает для 0,0001, 0,00001, 0,000001

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...